The best way to get a reason for improvement is using your own program — currently I constantly switch between Skila and NLT parser generator, because every feature I add makes my work on Skila much easier.
I added types definitions, so no longer I have to cast the symbol objects in the code blocks:
types expression Expression; IDENTIFIER IdentifierSymbol; end
With such definitions I can use symbol object “expression
” and C# code will know it is of type “Expression
”.
With sets and sequences I can reduce amount of rules significantly — sets:
fparam -> [ r:REF s:SINK e:EXCL ]? id:IDENTIFIER { new FunctionParameter(...) };
Here we see an optional set (very similar notion to regular expressions) — identifier can be preceded by “PARAM_REF
” or “SINK
” or “EXCLAMATION
” or (set above is optional) nothing.
Once I implemented set, sequence was an obvious addition:
field -> id:IDENTIFIER t:type (EQ ex:expression)? { new ClassField(...) };
Type can be followed by “ASSIGN
” and “expression
”. Unlike set it is everything (entire sequence in given order) or — in case of optional sequence, like here — nothing.
On Skila front I made some progress working on reference types (class
) but finishing it will take some more time.