*/
%{
+/* ignore harmless bug in old versions of flex */
+#pragma GCC diagnostic ignored "-Wsign-compare"
+
#include "command_parse.h"
-extern void set_lexer_string (const char *);
-extern void cleanup_lexer (void);
-YY_BUFFER_STATE buffer;
+#define YY_USER_ACTION yylloc->last_column += yyleng;
+#define LOC_STEP do { if (yylloc) { \
+ yylloc->first_column = yylloc->last_column; \
+ yylloc->first_line = yylloc->last_line; \
+ } } while(0)
%}
-WORD (\-|\+)?[a-z\*][-+_a-zA-Z0-9\*]*
+WORD (\-|\+)?[a-z0-9\*][-+_a-zA-Z0-9\*]*
IPV4 A\.B\.C\.D
IPV4_PREFIX A\.B\.C\.D\/M
IPV6 X:X::X:X
IPV6_PREFIX X:X::X:X\/M
+MAC M:A:C
+MAC_PREFIX M:A:C\/M
VARIABLE [A-Z][-_a-zA-Z:0-9]+
NUMBER (\-|\+)?[0-9]{1,20}
RANGE \({NUMBER}[ ]?\-[ ]?{NUMBER}\)
%option noyywrap
%option nounput
%option noinput
-%option outfile="command_lex.c"
+%option outfile="lib/command_lex.c"
+%option header-file="lib/command_lex.h"
+%option prefix="cmd_yy"
+%option reentrant
+%option bison-bridge
+%option bison-locations
%%
-[ /t] /* ignore whitespace */;
-{WORD} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return WORD;}
-{IPV4} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV4;}
-{IPV4_PREFIX} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV4_PREFIX;}
-{IPV6} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV6;}
-{IPV6_PREFIX} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return IPV6_PREFIX;}
-{VARIABLE} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return VARIABLE;}
-{RANGE} {yylval.string = XSTRDUP(MTYPE_TMP, yytext); return RANGE;}
+%{
+ LOC_STEP;
+%}
+
+[ \t]+ LOC_STEP /* ignore whitespace */;
+{WORD} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return WORD;}
+{IPV4} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4;}
+{IPV4_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV4_PREFIX;}
+{IPV6} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6;}
+{IPV6_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return IPV6_PREFIX;}
+{MAC} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC;}
+{MAC_PREFIX} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return MAC_PREFIX;}
+{VARIABLE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return VARIABLE;}
+{RANGE} {yylval->string = XSTRDUP(MTYPE_LEX, yytext); return RANGE;}
. {return yytext[0];}
%%
-void
-set_lexer_string (const char *string)
+YY_BUFFER_STATE buffer;
+
+void set_lexer_string (yyscan_t *scn, const char *string)
{
- buffer = yy_scan_string (string);
+ *scn = NULL;
+ yylex_init(scn);
+ buffer = yy_scan_string (string, *scn);
}
-void
-cleanup_lexer ()
+void cleanup_lexer (yyscan_t *scn)
{
- yy_delete_buffer (buffer);
+ // yy_delete_buffer (buffer, *scn);
+ yylex_destroy(*scn);
}