]> git.proxmox.com Git - mirror_frr.git/blob - lib/command_lex.l
Merge pull request #12830 from anlancs/fix/doc-ripd-rst
[mirror_frr.git] / lib / command_lex.l
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3 * Command format string lexer for CLI backend.
4 *
5 * --
6 * Copyright (C) 2015 Cumulus Networks, Inc.
7 */
8
9 %top{
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13 }
14 %{
15 /* ignore flex generated code in static analyzer */
16 #ifndef __clang_analyzer__
17
18 /* ignore harmless bugs in old versions of flex */
19 #pragma GCC diagnostic ignored "-Wsign-compare"
20 #pragma GCC diagnostic ignored "-Wmissing-prototypes"
21
22 #include "lib/command_parse.h"
23
24 #define YY_USER_ACTION yylloc->last_column += yyleng;
25 #define LOC_STEP do { if (yylloc) { \
26 yylloc->first_column = yylloc->last_column; \
27 yylloc->first_line = yylloc->last_line; \
28 } } while(0)
29 %}
30
31 IPV4 A\.B\.C\.D
32 IPV4_PREFIX A\.B\.C\.D\/M
33 IPV6 X:X::X:X
34 IPV6_PREFIX X:X::X:X\/M
35 MAC X:X:X:X:X:X
36 MAC_PREFIX X:X:X:X:X:X\/M
37 VARIABLE [A-Z][-_A-Z:0-9]+
38 WORD (\-|\+)?[a-zA-Z0-9\*][-+_a-zA-Z0-9\*]*
39 NUMBER (\-|\+)?[0-9]{1,20}
40 RANGE \({NUMBER}[ ]?\-[ ]?{NUMBER}\)
41
42 /* yytext shall be a pointer */
43 %pointer
44 %option noyywrap
45 %option nounput
46 %option noinput
47 %option outfile="lib/command_lex.c"
48 %option header-file="lib/command_lex.h"
49 %option prefix="cmd_yy"
50 %option reentrant
51 %option bison-bridge
52 %option bison-locations
53
54 %%
55 %{
56 LOC_STEP;
57 %}
58
59 [ \t]+ LOC_STEP /* ignore whitespace */;
60 {IPV4} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4;}
61 {IPV4_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4_PREFIX;}
62 {IPV6} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6;}
63 {IPV6_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6_PREFIX;}
64 {MAC} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC;}
65 {MAC_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC_PREFIX;}
66 {VARIABLE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return VARIABLE;}
67 {WORD} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return WORD;}
68 {RANGE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return RANGE;}
69 !\[ {yylval->string = NULL; return EXCL_BRACKET;}
70 . {return yytext[0];}
71 %%
72
73 static YY_BUFFER_STATE buffer;
74
75 void set_lexer_string (yyscan_t *scn, const char *string)
76 {
77 *scn = NULL;
78 yylex_init(scn);
79 buffer = yy_scan_string (string, *scn);
80 }
81
82 void cleanup_lexer (yyscan_t *scn)
83 {
84 // yy_delete_buffer (buffer, *scn);
85 yylex_destroy(*scn);
86 }
87
88 #endif /* __clang_analyzer__ */