25
07/07/07 ifc Es geht immer einfacher... Axel T. Schreiner http://www.cs.rit.edu/~ats/talks/ifc07/ 1 http://www.cs.rit.edu/~ats/talks/ifc07/

Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Es geht immer einfacher...

Axel T. Schreinerhttp://www.cs.rit.edu/~ats/talks/ifc07/

1

http://www.cs.rit.edu/~ats/talks/ifc07/

Page 2: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

LL(1) (recursive descent)

generalparserGrammatik als GraphParser als Graph-Traverse

Validierung für unix/mail Manuskripte

Wirth’s Compilerbau 1977?

3

http://www.cs.inf.ethz.ch/~wirth/books/Compilerbau0/

Page 3: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Compilerbau Ulm 1978?

Pascal

recursive descent

J.J. HorningLR Grammars and Analysersin Bauer Compiler Construction 1974

Unix (v6), yacc und C

Pascal Makros für C

7

http://portal.acm.org/citation.cfm?id=1102008&coll=GUIDE&dl=GUIDE&CFID=27483821&CFTOKEN=51588505

Page 4: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Grammatik

Grammatikbegriffe (darunter ein Startsymbol)

Eingabesymbole

(kontext-freie) Regeln

BNF

9

summe: zahl | summe '+' zahlzahl: Ziffernfolge

John Backus

Peter NaurNoam Chomsky

12 + 34 + 56

Page 5: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Wurzel: StartsymbolKnoten: GrammatikbegriffAbkömmlinge: Alternative einer RegelBlatt: Eingabesymbol

Links-Rekursion: Klammerung von links

Syntaxbaum

11

summe

summe

zahl

zahl'+'

12

34

summe zahl'+'

56

summe: zahl | summe '+' zahlzahl: Ziffernfolge

12 + 34 + 56

Page 6: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

LL(1) recursive descent

14

summe

summe

zahl

zahl'+'

12

34

summe zahl'+'

56

Left-to-rightLeft-most derivation1 symbol lookahead

Erkennung traversiert Grammatik,beginnend mit Startsymbol (top-down)

Nächstes Eingabesymbol wählt, welcheAlternative der Regel verfolgt wird

Links-Rekursion stört...summe: zahl | summe '+' zahlzahl: Ziffernfolge

12 + 34 + 56

Page 7: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Extended BNF

Syntax für Iteration vermeidet Links-Rekursion

Regeln entsprechenErkennungsfunktionen

Klammerung muß verabredet werden

17

summe: zahl ('+' zahl)*zahl: Ziffernfolge

summe() { zahl(); while (match('+')) zahl(); }zahl() { match(Ziffernfolge); }

summe

zahl zahl'+'

12 34

zahl'+'

56

Page 8: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

LR(1) Knuth 1965

20

summe

summe

zahl

zahl'+'

12

34

summe zahl'+'

56

Left-to-rightRight-most derivation1 symbol lookahead

Erkennung traversiert Eingabe (bottom-up)

Tabelle entscheidet, ob und welcheAlternative einer Regel gefunden wurde

Symbole werden zusammengefaßt; zuletztzum Startsymbol

Links-Rekursion ist ok...

summe: zahl | summe '+' zahlzahl: Ziffernfolge

12 + 34 + 56

Page 9: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

yacc Johnson 1975

yacc berechnet die Tabelle aus BNF

yyparse() interpretiert die Tabelle,holt Eingabe vom Scanner, manipulierteinen Stack mit Zuständen

und führt benutzer-definierte Aktionenmit einem parallelen Wert-Stack aus

22

{ $$ = addiere($1, $3); }{ $$ = atoi(text($1)); }

Werte

Zust!nde

Tabelle

Zeichenfolge

Scanner

Eingabesymbol

summe: zahl | summe '+' zahlzahl: Ziffernfolge

12 + 34 + 56

http://dinosaur.compilertools.net/

Page 10: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Es geht immer einfacher...

Java, OOP und Design Patterns

Scanner

Tree Factory

Struktur der Bäume

[Fehlerbehandlung]

allerdings: Objecting to Objects (Johnson 1994)

23

http://www.usenix.org/publications/library/proceedings/sf94/full_papers/johnson.html

Page 11: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

yacc-Algorithmus selbst unverändertyyparse() und Tabelle in Java oder C#Wert-Stack: Object

Animation à la Holub

Java-Port mit nestedvm

verwendet im Mono Projekt

jay LR(1), BNF

26

Skelett jay Parser

Grammatik

http://www.cs.rit.edu/~ats/projects/lp/doc/jay/package-summary.htmlhttp://nestedvm.ibex.org/http://www.mono-project.com/Main_Page

Page 12: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

oops LL(1), EBNF

generalparser: Grammatik als Objektbaum darstellenMethoden für Erkennung und Grammatik-Prüfung

divide&conquerRegel-spezifischer Observer per Regel-Aktivierungverschiedene Factories, z.B. für Scanner und Observer

EBNF beschreibt sich selbst: bootstrapverschiedene EingabesprachenGrammatik völlig getrennt von Aktionen

31

Parser

Rule Sequence

Nonterminal Repeat 0..!

Literal

summe

zahl

'+' zahl

Nonterminal

Rule Token

zahl Ziffernfolge

summe: zahl ('+' zahl)* zahl: Ziffernfolge

summe: zahl [{'+' zahl}]zahl: Ziffernfolge

http://www.cs.rit.edu/~ats/projects/oops/edu/doc/index.html

Page 13: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

summe

summe

zahl

zahl'+'

12

34

summe zahl'+'

56

jag Pattern-basierter Visitor

Syntaxbaum eignet sich kaum zur Verarbeitung

Formelbaum:Klasse für LiteralBlatt für Token

Präprozessor:Knoten-Klassen wählen AktionenVererbung als Muster

34

Add: Object Object { return (int)visit(0) + (int)visit(1); }};Leaf: Integer { return $1;};

Add

LeafAdd

56

12

Leaf Leaf

34

http://www.cs.rit.edu/~ats/projects/lp/doc/jag/package-summary.html

Page 14: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

JLex

jay

grammar rules

BNF

regular

expressions

factory

tree classes

lexical analysis

symbols

syntax analysis

pj

12 + 34 + 56

Add Add Leaf 12 Leaf 34 Leaf 56

pj JLex-Scanner, Bäume, error

Präprozessor für jay:

Scanner aus Literalen und Muster für TokenFactory für Formelbaum (EOPL2)Animation und Fehlerbehandlung

37

public class summe {%token <Integer> Zahlenfolge {digits}digits = [0-9]+%%<Node> summe: summe '+' zahl <Add> | zahl;<Node> zahl: Zahlenfolge <Leaf>;%%}

http://www.cs.rit.edu/~ats/projects/lp/doc/pj/package-summary.htmlhttp://www.cs.princeton.edu/~appel/modern/java/JLex/http://www.cs.indiana.edu/eopl/

Page 15: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

wcs Compilerbau im Web

wcs.Applet emuliert eine Konsole und ist Delegate für eine fingierte System Klasse in jeder package

38

tomcat

wcs Servlet

pj... javac

HTML form Applet

http://www.cs.rit.edu/~ats/projects/lp/doc/wcs/package-summary.htmlhttp://wcs.cs.rit.edu:8080/wcs/wcs?form=true&processor.0=javac&source.0=http://www.cs.rit.edu/~ats/talks/wcs/hello.txt&sink.0=applethttp://wcs.cs.rit.edu:8080/wcs/wcs?processor.0=javac&source.0=http://www.cs.rit.edu/~ats/talks/wcs/hello.txt&sink.0=applet

Page 16: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

oops3.net (greedy) LL(1), XBNF

39

public class parser {

%%

<void> Comment = '#.*';

<void> WhiteSpace = '[ \r\t\n]+';

<Integer> Number = '[0-9]+';

<Sum>? sum: term (add | subtract)*;

<Add> add: '+' term;

<Subtract> subtract: '-' term;

term: Number | '(' sum ')';

%%

}

oops3 parser

# input

3 - (4 + 5)

2 Sum

Integer 3

2 Subtract

2 Sum

Integer 4

2 Add

Integer 5

javac

Algorithmen als VisitorsLL(1) Test optional

Baum-Struktur unabhängig von GrammatikSyntax für left-assoziative Konstruktion

Permutationen

http://www.cs.rit.edu/~ats/projects/oops3/doc/http://www.cs.rit.edu/~ats/projects/oops3.net/doc/

Page 17: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Parser visit start ruleRule n: rhs visit right-hand sideLiteral 'a' advance inputToken Id advance inputNonterminal n visit ruleSequence a b visit descendants

Repeata+a*a?

greedy loop: visit descendant

Xor a|b visit proper descendant

Recognition Visitor

40

Page 18: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Parser visit start ruleRule n: rhs visit right-hand sideLiteral 'a' advance inputToken Id advance input collect valueNonterminal n visit ruleSequence a b visit descendants

Repeata+a*a?

greedy loop: visit descendant

Xor a|b visit proper descendant

Building: Flat

41

Page 19: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Parser visit start ruleRule n: rhs visit right-hand side build nodeLiteral 'a' advance inputToken Id advance input collect valueNonterminal n visit rule collect nodeSequence a b visit descendants

Repeata+a*a?

greedy loop: visit descendant

Xor a|b visit proper descendant

Building: Parse Tree

42

Page 20: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Parser visit start ruleRule <C> n: rhs visit right-hand side C n(aList)Literal 'a' advance inputToken Id advance input collect valueNonterminal n visit rule collect CSequence a b visit descendants

Repeata+a*a?

greedy loop: visit descendant

Xor a|b visit proper descendant

Building: Tree

rule collection is delegated by reflection on rule name.ArrayList results are flattened during collection.

43

Page 21: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

XBNF: Counts

Repeat can use any range, not just 0, 1, and ∞.

item +item ?item *item 1..item ..1item ..item 2..3

44

Page 22: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

XBNF: Delimited Lists

Delimit extends Repeatany range of more then 1 can have a separator (which may even be empty).

item +item ?item *item 1.. / delimiteritem ..1item ..item 2..3

45

Page 23: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

XBNF: Permutations

unordered full set (permutation):

unordered subset:

top-level nested ranges are counted at the level of the permutation, i.e., their constituents can be permuted.

{ item, item ... }{ item, item ... } / delimiter

[ item, item ... ][ item, item ... ] / delimiter

46

Page 24: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

pj2 LR(1), EBNF

Präprozessor wie pj

Baum-Strukturierung wie oops3

kombiniert EBNF vollständig mit LR(1),erlaubt also zum Beispiel auch Links-Rekursion

47

Page 25: Axel T. SchreinerAts/Talks/Ifc07/Ifc07.pdf07/07/07 ifc – oops’ LL(1), EBNF generalparser: Grammatik als Objektbaum darstellen Methoden für Erkennung und Grammatik-Prüfung divide&conquer

07/07/07 ifc –

Es geht immer einfacher...wcs

XML für Job-Beschreibung und Programm-Strukturlose Koppelung für neue ToolsSilverlight?

pj2XBNF

jagXPath-artige Syntax?Syntax für beans-artige Zugriffe?

oops3LL(k)Fehlerbehandlung

48