- destroy haengt in Endlosschleife - in scanner: use an combination of dynamic buffer and atomic symbol/token sub-library to allow first tokens of mostly arbitrary size and then to store the tokens redundancy-free. - Problem: \x00 oder \x{00} wird zu NUL-terminator -> use ptr+len instead - caStr/cpStr durch yyless/yymore?? - syntax verification - command line query tool - error checking in scanner? - OSSP ex support - wieso geht sample.cfg nicht als Arg bei "make check"? - newline in error message $ ./cfg_test sample2.cfg ERROR: quu'> - cfg_t rewrite-uri { } rewrite-uri ^/(.*) /path/$1 --redirect=permanent q{ %{SOURCE} != "x" }; Directory [--foo=A] Argument: - type: - keyword ("foo") via name - option ("--foo=BAR") via name & regex - argument ("foo") via regex - amount: - 1 - 0/1 ? - 0..n * - 1..n + - location: - by position - by name - lookup via: - name - position - regex match foo * bar foo = bar|quux|... foo (bar baz quux) foo ::= bar* ; kleene closure foo ::= bar|baz|quux ; union foo ::= bar baz quux ; concatenation foo ::= {foo;...} ; sequence of ... foo ::= (...) ; grouping foo ::= "bar" ; fixed terminal foo ::= /bar/ ; regex terminal foo ::= ; arbitrary argument foo ::= ; arbitrary option SEQ ::= "{" DIR DIR* "}" DIR ::= TOK (" " TOK)* ";" TOK ::= ... SEQ ::= DIR* SEQ(dir,dir,...) DIR ::= TOK+ DIR(tok,tok,...) TOK ::= string "..." config ::= SEQ(directory|user|rewrite|access) directory ::= DIR("directory",*,) dir_options ::= user ::= DIR("user",/^[a-z]$/) rewrite ::= access ::= "access" ("allow"|"deny"):action SEQ(access_list):acl access_list ::= m/^!?%{ID}$/ acl ::= "acl" TOK:name acl_list acl_list ::= SEQ(acl_entry) acl_entry ::= acl_action "from" net-addr:src "to" net-addr:dst acl_action ::= "allow"|"deny" net_addr ::= net_hostname | net_ipv4addr | net_ipv6addr sequence all { directive --class 1; }; directive --class 1 "foo" { option "bar" --occur=1 }; --------------------------------------------------------------------------- foo on; bar /bla { foo off; baz --fuck { b1; b2 --nase=baer; b3; b4; b5; } --fuck2; }; quux a1 a2 a3 a4; quux; --------------------------------------------------------------------------- sequence ROOT { directive foo; directive bar; directive quux --count=1:oo; }; sequence bar-seq { directive foo --count=0:1; directive baz --count=1:oo; }; directive foo { token - on|off|yes|no; }; directive bar { token path /.*; sequence bar-seq; }; directive baz { option fuck; option fuck2; sequence { directive foo { option nase (baer|hugo); option foo [0-9]; token ip-address; }; }; }; directive quux { token --count=0:oo a.*; }; token ip-address b1|b2|b3|b4|b5; ------------------------------------------------------------------------------- ::= "sequence" ? ; | "sequence" ? ? "{" * "}"; ::= "directive" ? ; | "directive" ? ? "{"