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.
9 /* lex-func-prefix: zz */
18 #include "bpf_hla_parser.tab.h"
19 #include "bpf_symtab.h"
22 void bpf_hla_lex_init(void);
29 #define KEYPAIR(k,t) { .key = (k), .token = (t)}
30 static const struct res_keywords keytab[] = {
31 KEYPAIR("def", K_DEF),
32 KEYPAIR("pkt", K_PKT),
33 KEYPAIR("ret", K_RET),
35 KEYPAIR("elif", K_ELIF),
36 KEYPAIR("else", K_ELSE),
38 KEYPAIR("ipv4", K_MACRO_IPV4),
39 KEYPAIR("ipv6", K_MACRO_IPV6),
40 KEYPAIR("ip", K_MACRO_IP),
41 KEYPAIR("udp", K_MACRO_UDP),
42 KEYPAIR("tcp", K_MACRO_TCP),
45 void bpf_hla_lex_init(void)
48 for (i = 0; i < array_size(keytab); ++i)
49 bpf_symtab_insert(keytab[i].key, keytab[i].token);
52 #define YY_USER_INIT bpf_hla_lex_init();
54 extern void zzerror(const char *);
70 number_oct ([0][0-9]+)
71 number_hex ([0][x][a-fA-F0-9]+)
72 number_bin ([0][b][0-1]+)
73 number_dec (([0])|([-+]?[1-9][0-9]*))
78 zzlval.idx = bpf_symtab_find(zztext);
80 zzlval.idx = bpf_symtab_insert(zztext, K_NAME);
83 return bpf_symtab_type(zzlval.idx);
105 {number_hex} { zzlval.number = strtoul(zztext, NULL, 16);
108 {number_dec} { zzlval.number = strtol(zztext, NULL, 10);
111 {number_oct} { zzlval.number = strtol(zztext + 1, NULL, 8);
114 {number_bin} { zzlval.number = strtol(zztext + 2, NULL, 2);
117 "/*"([^\*]|\*[^/])*"*/" { /* NOP */ }
118 ";"[^\n]* {/* NOP */}
121 . { printf("Unknown character '%s'", zztext);
122 zzerror("lex Unknown character"); }