Lambda ist der Parser-Generator der Intersult.
Der Parser enthält bereits eine Reihe von Parsern für bestimmte Ausdrücke, die durch eine Metasprache angewendet werden können.
Die grundlegenden Elemente sind:
Symbol | Parser | Beschreibung |
---|---|---|
" | quote-literal | Ein String (auch Literal) kann von zwei Quotes '"' (Anrührungsstrichen) umschlossen sein. |
' | apos-literal | Ein String kann von zwei Apos "'" (Apostrophenzeichen) umschlossen sein. |
| | choice-expression | Definiert eine Entscheidung dass entweder der linke oder der rechte Teil neben dem Symbol verwendet werden darf. |
+ | sequence-expression | Legt fest, dass zuerst der linke Teil und dann der rechte Teil neben dem Symbol kommen muss. |
# | delimiter-repetition-parser | Drückt aus dass der linke Teil beliebig oft wiederholt werden darf, wenn sich zwischen den Wiederholungen jeweils der rechte Teil befindet. |
! | simple-repetition-parser | Drückt aus, dass der linke Teil beliebig oft wiederholt werden darf. |
. | terminal-parser-expression | Zeigt an, dass der linke Teil am Ende der Eingabe stehen muss. |
; | parser-set | Trennt zwei Parser-Definitionen voneinander ab. |
:= | parser-definition | Ordnet dem linken Teil "Parsernamen" die Definition auf der rechten Seite zu. |
ParseNode hat zwei Implementierungen:
Parsers parsers = Parsers.getGlobal().clone(); parsers.create("test := operation-low + eof;"); parsers.create("bracket-expression := '(' + operation-low + ')';"); parsers.create("operand-high := symbol | bracket-expression;");"); parsers.create("operation-high := operand-high #1 ('*'| '/');"); parsers.create("operand-low := operation-high | symbol;"); parsers.create("operation-low := operand-low #1 ('+' | '-')");)";
Die Anwendung sieht dann so aus:
Scanner scanner = new Scanner("(x+y)*(a+b)+z"); ParseNode tree = parsers.parse("test", scanner); System.out.println(tree);
Das Ergebnis ist ein Abstract-Syntax-Tree (oft als AST bezeichnet) mit der Wurzel bei der lokalen Variable tree vom Typ ParseNode.
ParseNode hat zu Debug-Zwecken eine toString-Methode, die folgendes Ergebnis liefert:
test( operation-low( operand-low( operation-high( operand-high( bracket-expression( "(", operation-low( operand-low( operation-high( operand-high("x") ) ), "+", operand-low( operation-high( operand-high("y") ) ) ), ")" ) ), "*", operand-high( bracket-expression( "(", operation-low( operand-low( operation-high( operand-high("a") ) ), "+", operand-low( operation-high( operand-high("b") ) ) ), ")" ) ) ) ), "+", operand-low( operation-high( operand-high("z") ) ) ), "eof" )
new ChoiceParser(parsers, "sequence-element", "repetition-parser", "sequence-expression", "parser-element");