This page (revision-8) was last changed on 20-Jun-2014 20:54 by Dieter Käppel

This page was created on 26-Apr-2012 14:22 by Dieter Käppel

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
8 20-Jun-2014 20:54 11 KB Dieter Käppel to previous
7 20-Jun-2014 20:54 11 KB Dieter Käppel to previous | to last
6 20-Jun-2014 20:52 11 KB Dieter Käppel to previous | to last
5 20-Jun-2014 20:48 10 KB Dieter Käppel to previous | to last
4 20-Jun-2014 20:30 9 KB Dieter Käppel to previous | to last
3 01-Nov-2012 00:11 5 KB Dieter Käppel to previous | to last
2 26-Apr-2012 14:43 2 KB Dieter Käppel to previous | to last
1 26-Apr-2012 14:22 2 KB Dieter Käppel to last

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 4 changed one line
Einige Anwendungen können nicht in Java oder XML geschrieben werden, es wäre geschickter wenn man eine eigene Sprache hätte. [Lambda] vereinfacht die Implementierung einer Sprache extrem, zu wenigen Zeilen Code.
Einige Anwendungen können nicht in Java oder XML geschrieben werden, es wäre geschickter wenn man eine eigene Sprache hätte. [Lambda] vereinfacht die Implementierung einer Sprache extrem, zu wenigen Zeilen Code. Der Parser erzeugt einen Abstract-Syntax-Tree, also eine Baumstruktur mit den im Eingabestring gefundenen Elementen.
At line 16 changed 7 lines
|~| |__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.
|~| |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.
At line 24 added 14 lines
!!!Ergebnis
Das Ergebnis ist ein Abstract-Syntax-Tree mit Nodes vom Typ ParseNode. Die Klasse ParseNode ist abstrakt und hat folgende Methoden:
* __parser:__ Gibt den Parser zurück, der diese Node geparsed hat.
* __length:__ Liefert die Anzahl der Zeichen des von diesem Parser akzeptierten Ausdrucks.
* __value:__ Gibt den Ausdruck zurück, der von diesem Parser akzeptiert wurde.
ParseNode hat zwei Implementierungen:
* __Terminal:__ Zeigt an, dass es sich um eine Zeichenfolge handelt, die nicht weiter herunter gebrochen werden kann.
* __NonTerminal:__ Wurde von einem Parser erzeugt, der sich selbst aus anderen Parsern zusammensetzt (Operator ':='). NonTerminal enthält zwei weitere Methoden:
** __count:__ Anzahl der untergeordneten ParseNode-Elemente.
** __get:__ Liefert die ParseNode einer bestimmten Position zurück. Die Position n liegt dabei zwischen 0 <= n < count.
At line 37 changed one line
!!!Parser-Klassen
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"
)
}}}
!!!Eigene Parser-Klassen