2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2012 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
5 * Swiss federal institute of technology (ETH Zurich)
6 * Subject to the GPL, version 2.
16 #include "bpf_hla_parser.tab.h"
17 #include "bpf_symtab.h"
20 void bpf_hla_lex_init(void);
27 #define KEYPAIR(k,t) { .key = (k), .token = (t)}
28 static const struct res_keywords keytab[] = {
29 KEYPAIR("def", K_DEF),
30 KEYPAIR("pkt", K_PKT),
31 KEYPAIR("ret", K_RET),
33 KEYPAIR("elif", K_ELIF),
34 KEYPAIR("else", K_ELSE),
36 KEYPAIR("ipv4", K_MACRO_IPV4),
37 KEYPAIR("ipv6", K_MACRO_IPV6),
38 KEYPAIR("ip", K_MACRO_IP),
39 KEYPAIR("udp", K_MACRO_UDP),
40 KEYPAIR("tcp", K_MACRO_TCP),
43 void bpf_hla_lex_init(void)
46 for (i = 0; i < array_size(keytab); ++i)
47 bpf_symtab_insert(keytab[i].key, keytab[i].token);
50 #define YY_USER_INIT bpf_hla_lex_init();
52 extern void zzerror(const char *);
76 number_dec {digit_n}|{digit_s}{digit}*
77 number_oct {digit_n}{digit}+
78 number_hex {digit_n}{hex_x}{hex}+
79 number_bin {digit_n}{bindigit_b}{bindigit}+
84 zzlval.idx = bpf_symtab_find(zztext);
86 zzlval.idx = bpf_symtab_insert(zztext, K_NAME);
89 return bpf_symtab_type(zzlval.idx);
111 {number_hex} { zzlval.number = strtoul(zztext, NULL, 16);
114 {number_dec} { zzlval.number = strtol(zztext, NULL, 10);
117 {number_oct} { zzlval.number = strtol(zztext, NULL, 8);
120 {number_bin} { zzlval.number = strtol(zztext + 2, NULL, 2);
123 "/*"([^\*]|\*[^/])*"*/" { /* NOP */ }
124 ";"[^\n]* {/* NOP */}
127 . { printf("Unknown character '%s'", zztext);
128 zzerror("lex Unknown character"); }