summaryrefslogtreecommitdiffstats
path: root/src/lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.l')
-rw-r--r--src/lexer.l133
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;
+}