diff options
Diffstat (limited to 'src/lexer.l')
-rw-r--r-- | src/lexer.l | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/lexer.l b/src/lexer.l new file mode 100644 index 0000000..9e13448 --- /dev/null +++ b/src/lexer.l @@ -0,0 +1,133 @@ +%{ +/* + * (C) 2024-2025 by Pablo Neira Ayuso <pablo@netfilter.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* Funded through the NGI0 Entrust established by NLnet (https://nlnet.nl) + * with support from the European Commission's Next Generation Internet + * programme. + */ + +#include <string.h> +#include "parser_yy.h" + +%} + +%option yylineno +%option noinput +%option nounput + +ws [ \t]+ +comment #.*$ +nl [\n\r] + +string [a-zA-Z][a-zA-Z0-9\.\-\_]* +quotedstring \"[^"]*\" +null [N][U][L][L] + +%% + +"add_table" { return T_ADD_TABLE; } +"set_table" { return T_SET_TABLE; } +"del_table" { return T_DEL_TABLE; } +"add_basechain" { return T_ADD_BASECHAIN; } +"del_basechain" { return T_DEL_BASECHAIN; } +"add_chain" { return T_ADD_CHAIN; } +"del_chain" { return T_DEL_CHAIN; } +"add_set" { return T_ADD_SET; } +"set_set" { return T_SET_SET; } +"del_set" { return T_DEL_SET; } +"flush_set" { return T_FLUSH_SET; } +"add_flowtable" { return T_ADD_FLOWTABLE; } +"del_flowtable" { return T_DEL_FLOWTABLE; } +"add_rule" { return T_ADD_RULE; } +"del_rule" { return T_DEL_RULE; } +"add_elem" { return T_ADD_ELEM; } +"del_elem" { return T_DEL_ELEM; } +"bitwise" { return T_ADD_BITWISE; } +"byteorder" { return T_ADD_BYTEORDER; } +"cmp" { return T_ADD_CMP; } +"connlimit" { return T_ADD_CONNLIMIT; } +"counter" { return T_ADD_COUNTER; } +"ct" { return T_ADD_CT; } +"dup" { return T_ADD_DUP; } +"dynset" { return T_ADD_DYNSET; } +"exthdr" { return T_ADD_EXTHDR; } +"fib" { return T_ADD_FIB; } +"flow_offload" { return T_ADD_FLOW_OFFLOAD; } +"fwd" { return T_ADD_FWD; } +"hash" { return T_ADD_HASH; } +"immediate" { return T_ADD_IMMEDIATE; } +"inner" { return T_ADD_INNER; } +"last" { return T_ADD_LAST; } +"limit" { return T_ADD_LIMIT; } +"log" { return T_ADD_LOG; } +"lookup" { return T_ADD_LOOKUP; } +"masq" { return T_ADD_MASQ; } +"match" { return T_ADD_MATCH; } +"meta" { return T_ADD_META; } +"nat" { return T_ADD_NAT; } +"numgen" { return T_ADD_NUMGEN; } +"objref" { return T_ADD_OBJREF; } +"osf" { return T_ADD_OSF; } +"payload" { return T_ADD_PAYLOAD; } +"queue" { return T_ADD_QUEUE; } +"quota" { return T_ADD_QUOTA; } +"range" { return T_ADD_RANGE; } +"redir" { return T_ADD_REDIR; } +"reject" { return T_ADD_REJECT; } +"rt" { return T_ADD_RT; } +"socket" { return T_ADD_SOCKET; } +"synproxy" { return T_ADD_SYNPROXY; } +"target" { return T_ADD_TARGET; } +"tproxy" { return T_ADD_TPROXY; } +"tunnel" { return T_ADD_TUNNEL; } +"xfrm" { return T_ADD_XFRM; } +"add_obj_counter" { return T_ADD_OBJ_COUNTER; } +"add_obj_quota" { return T_ADD_OBJ_QUOTA; } +"add_obj_ct_helper" { return T_ADD_OBJ_CT_HELPER; } +"add_obj_ct_expect" { return T_ADD_OBJ_CT_EXPECT; } +"add_obj_limit" { return T_ADD_OBJ_LIMIT; } +"add_obj_connlimit" { return T_ADD_OBJ_CONNLIMIT; } +"add_obj_tunnel" { return T_ADD_OBJ_TUNNEL; } +"add_obj_ct_timeout" { return T_ADD_OBJ_CT_TIMEOUT; } +"add_obj_secmark" { return T_ADD_OBJ_SECMARK; } +"add_obj_synproxy" { return T_ADD_OBJ_SYNPROXY; } +"add_obj_unknown" { return T_ADD_OBJ_UNKNOWN; } +"del_obj_unknown" { return T_DEL_OBJ_UNKNOWN; } +"commit" { return T_COMMIT; } +"abort" { return T_ABORT; } + +{null} { return NULLSTR; } + +{quotedstring} { + yytext[yyleng - 1] = '\0'; + yylval.string = strdup(yytext + 1); + return QSTRING; + } + +{string} { + yylval.string = strdup(yytext); + return STRING; + } + +{comment} ; +{ws} ; +{nl} ; + +<<EOF>> { yyterminate(); } + +. { return yytext[0]; } + +%% + +int +yywrap(void) +{ + return 1; +} |