Soo die libphorward hat jetzt auch eine schönere Grammatik für ihre BNF-Sprache. Die bereits beim self-hosting Prozess verwendete Grammatik sieht jetzt so aus:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ /[ \t\r\n]+/ %ignore; $ccl /'.*'/ %emit 1; $string /".*"/ %emit 2; $regex /\/(\\.|[^\\\/])*\// %emit 3; $ident /[A-Za-z_][A-Za-z0-9_]*/ %emit 10; $int /[0-9]+/ %emit 11; symbol : ident | ccl | string | regex | inline %emit 20; mod_kleene : symbol '*' %emit 25; mod_positive: symbol '+' %emit 26; mod_optional: symbol '?' %emit 27; modifier : mod_kleene | mod_positive | mod_optional | symbol ; sequence : sequence modifier | modifier ; alternative : sequence | %emit 30; alternation : alternation '|' alternative | alternative ; emit : "emit" int? %emit 42; flag : "noemit" | "goal" | "ignore" | "lexem" %emit 40; emitflag : emit | flag ; flags : flags '%' emitflag+ | '%' emitflag+ ; nontermdef : ident ':' alternation flags? ';' %emit 31; inline : '(' alternation ')' %emit 32; termdef : '$' ident? ( ccl | string | regex ) flags? ';' %emit 35; gflag : "emitall" | "emitnone" | "lrec" | "rrec" %emit 41; gflags : gflags '%' gflag+ | '%' gflag+ ; definition : nontermdef | termdef | gflags ; grammar : definition+ %goal; |
Kann sich doch eher sehen lassen, oder? Die $-Zeichen definieren Terminaldeklarationen, es sind auch anonyme Terminaldeklarationen erlaubt, und Inline-Terminals werden jetzt über einen Pattern-Matching-Mechanismus auf existenz geprüft, so dass diese nicht extra definiert werden müssen (so wie % und ;).
Ausserdem ist die Entwicklung jetzt erstmal nach Bitbucket umgezogen, weil Sourceforge der Meinung war, meinen Benutzernamen mit dem Namen eines indischen Java-Entwicklers, mit dem ich nichts gemeinsam habe, zu verlinken, weil da irgendein blöder Bug drin ist. Ausserdem benutzen wir Bitbucket auch bei mausbrand, und bin damit bisher sehr gut gefahren :).