De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

ANother Tool for Language Recognition

Verwante presentaties


Presentatie over: "ANother Tool for Language Recognition"— Transcript van de presentatie:

1 ANother Tool for Language Recognition
ANTLR ANother Tool for Language Recognition

2 Overzicht Inleiding: Antlr: what’s in a name?
Vertalers: lexers en parsers LL parser voordelen, akkefietjes Antlrworks: debugger Productieregels voor output Boomgrammatica (Antlr tree grammar) Boomparser (Antlr tree parser) Programmatransformaties Besluit

3 Inleiding ANTLR = ANother Tool for Language Recognition
programma om “compilers” te schrijven genereert parser voor front-end van compiler of voor domein-specifieke toepassing ANTLRWorks = antlr programmeeromgeving auteurs antlr:Terence Parr (UoSF) antlrworks: Jean Bovet (master student) locatie: tutorial: boek: the definitive Antlr reference CT467

4 Inleiding ANTLR v3 is geschreven in Java
Genereert gramatica’s in Java, C, C#,.. Motor = LL(*) top-down parser Vgl. lex/yacc: LR bottom-up Antlr gaat extra mile: Antlrworks: debug grammatica tijdens parsen Tree parser: parser van interne boomvoorstelling String template (source  source herschrijven)

5 Vertaler Wat is een vertaler?
Een vertaler leest een invoertekst, analyseert de structuur en schrijft een uitvoertekst Werking? Invoertekst is een stroom bytes. Deze wordt naar “handelbare” vorm gebracht in 2 fasen: Lexicale analyse: vormt woorden  alfabet Semantische analyse: vormt zinnen  taal

6 Lexicale Analyse Doel: “uit de stroom van bytes betekenisvolle woorden en leestekens te halen die eigen zijn aan de programmeertaal.” = tokens met attributen Vb.: 5 = geheel getal met waarde 5 a = variabele met naam “a”

7 Lexicale Analyse Tokens in EBNF, in hoofdletters, vb:
NUM : ('0'..'9')+; ALF : ‘A'..‘Z'|’a’..‘z'; ID : ALF (ALF|NUM)*; + : ≥ 1 (herhalingsteken, minstens 1) * : ≥ 0 (herhalingsteken, minstens 0) | : “of” Resultaat: “tokens”

8 Grammaticale Analyse Voldoet: 3, alfa, a+b; ander vb:
Grammatica definieert geldige zinnen, in kleine letters, bv. expr: expr : NUM | ID | expr '+' expr; Voldoet: 3, alfa, a+b; ander vb: var : ID; assign : var '=' expr; Resultaat: “grammaticaregels”

9 Grammaticale Analyse Parsing met productieregels non-terminals

10 Grammaticale Analyse Afleiding (derivation) = substitutie van nonterminals (ouder) door zijn productie (kinderen)  parseboom

11 Grammaticale Analyse Rechtse of linkse afleiding substitutie van meest rechtse of meest linkse nonterminal door productie  parseboom Toepassing: a : = 7 ; b : = c + (d := , d) Lexicale tokenstroom: id : = num; id : = id + (id := num + num, id)

12 Afleiding Voorbeeld a : = 7 ; b := c + ( d := 5 + 6 , d)
1 3 2 4 5 6 7 8 9 10 11 12 Afleiding Voorbeeld a : = 7 ; b := c + ( d := , d) Lexicale tokenstroom: id : = num; id : = id + ( id := num + num, id)

13 Afleiding Voorbeeld a : = 7 ; b := c + (d := 5 + 6 , d)
Lexicale tokenstroom: id : = num; id : = id + (id := num + num, id) Afleiding 1 3 2 4 5 6 7 8 9 10 11 12

14 Linkse Afleiding Voorbeeld a : = 7 ; b := c + (d := 5 + 6 , d)
Lexicale tokenstroom: id : = num; id : = id + (id := num + num, id) Linkse Afleiding 1 2 4 5 3 6

15 Contextvrije grammatica
Contextvrij = substitutie kan uitgevoerd worden onafhankelijk van de context = symbolen voor en na de substitutie Ambigue grammatica: waneer meerdere parsebomen mogelijk zijn

16 Predictieve Parser (LL)
Principe: de afleidingsregel voor non-terminals wordt bepaald door het ingelezen token, d.w.z. door de ingelezen terminal. Kan gerealiseerd worden door een Recursive descent parser

17 Predictieve Parser (LL)
Recursieve afdaling algoritme: 1 functie voor elke niet-terminaal 1 case voor elke productie Vb.: grammatica

18 3.2. Predictieve parsing Recursieve afdaling algoritme:

19 Grammatica in Antlr TOKENS = terminals regels = nonterminals
grammar = regels + tokens prog = startregel grammar prog; prog : assign+ EOF; assign : var '=' expr '\r\n'+; var : ID; expr : NUM | ID | expr '+' expr; NUM : ('0'..'9')+; ALF : ('a'..'z'|'A'..'Z')+; ID : ALF (ALF|NUM)*;

20 Grammatica in AntlrWorks

21 Linkse recursie conflict
In AntlrWorks:

22 Linkse recursie conflict
Ambiguïteit: welke regel start met dit token? bij input ID: expr  ID of expr  expr + expr ? beide regels kunnen met ID starten...

23 Linkse recursie conflict
Regel E start met E [1] E  E + T [2] E  T First(X)  start-tokens van regel (X) First(E) = First(E+T) U First(T)  welke productie: 1 of 2 ?

24 Linkse recursie herschrijven
Oplossing: a) herken ET|E+T als ET +T +T T b) herschrijf tot rechtse recursie E T (+T)*

25 Linkse recursie herschrijven
Linkse recursie wegwerken grammar prog; prog : assign+ EOF; assign : var '=' expr '\r\n'+; var : ID; expr : NUM | ID | expr '+' expr; NUM : ('0'..'9')+; ALF : ('a'..'z'|'A'..'Z')+; ID : ALF (ALF|NUM)*; Linkse recursie wegwerken door extra term

26 Linkse recursie herschrijven
Linkse recursie wegwerken grammar prog; prog : assign+ EOF; assign : var '=' expr '\r\n'+; var : ID; term : NUM | ID; expr : term (‘+’ term)*; NUM : ('0'..'9')+; ALF : ('a'..'z'|'A'..'Z')+; ID : ALF (ALF|NUM)*; Linkse recursie wegwerken door extra term

27 Debuggen in AntlrWorks
Eenvoudige grammatica Debuggen alfa=5 b=2+a

28 Debuggen in AntlrWorks
Debuggen: input alfa=5 b=2+a

29 Debuggen in AntlrWorks
Debuggen: input + startregel alfa=5 b=2+a

30 Debuggen in AntlrWorks
alfa=5 b=2+a

31 Gegenereerde bestanden
Wat genereert ANTLRWorks nu uit grammatica prog.g? progLexer.java, progParser.java main: __Test__.java  parser  lexer input: __Test__input.txt

32 Tokens en parseboom Debuggen – tokens + parseboom alfa=5 b=2+a

33 Gegenereerde bestanden
Structuur van het testprogramma:

34 Acties of producties toevoegen
Acties bij herkenning van tokens of regels regels: groen tokens: blauw grammatica: “token” lexer: “A”... “U”

35 Acties of producties toevoegen
@members = helper code actie: tel klinkers

36 Acties of producties toevoegen
@members = helper code actie: tel klinkers

37 Acties: tel klinkers Input: “aaeaiiou” Output en Afleidingsboom

38 Lexicale en grammaticale analyse
FRONT-END Lexicale analyse produceert tokens token = type van woord (bv. getal, “if”)

39 Lexicale en grammaticale analyse
FRONT-END Grammaticale analyse produceert syntax. AST = abstracte syntaxboom met betekenis van programma bewaart. Meestal is er extra informatie in symbooltabellen, afhankelijkheidsgrafen ...

40 Lexicale analyse en parsing
BACK-END De back-end loopt de AST af en genereert de output

41 Boomgenerator ANTLR genereert ook “CommonTree” bomen
Nut: overzichtelijke structuur,  boomvoorstellingen in  fasen, programmatransformaties. CommonTree bomen kunnen gegenereerd worden met de optie {output=AST}.

42 Boomgenerator CommonTree bomen kunnen gegenereerd worden met de optie {output=AST}. Boomoperaties zijn productieregels: operator om boom te maken: ^( ) Vb.: ^(wortel blad_1 ... blad_n) genereert

43 Boomgenerator Boom-grammatica: De output: via apart testprogramma....

44 Boomgenerator Testprogramma: ast = parser g  g.prog_ast  getTree()
print ast met ast.toStringTree().

45 Boomgenerator Resultaat van boomgeneratiegrammatica prog_ast:
= gewone output ($prog_ast.text) tree ouput (ast.toStringTree()).

46 Boomgenerator ANTLR genereert “CommonTree” bomen
Nut: programmatransformaties. Voorbeeld: for-lus 2x ontrollen in f.g

47 Boomgenerator TreeRewrite.g leest “CommonTree” genereert getransformeede lus Genererende tokens uit = f.g Grammatica f wordt ook gebruikt voor testprogramma in AntlrWorks!

48 Boomgenerator TreeRewrite.g leest “CommonTree” genereert getransformeede lus Genererende tokens uit = f.g Grammatica f wordt ook gebruikt voor testprogramma in AntlrWorks!

49 Boomgenerator TreeRewrite leest “CommonTree” bomen en genereert getransformeede lus

50 Boomgenerator Lustransformatie: Input: Output:
for (i=0; i < n; i++) { s = f(i); v = g(k); } for (i=0; i < n; i++) { s = f(i); v = g(k); }

51 Besluit ANTLR is zeer vriendelijk in gebruik
Extra mijl: booomparsers en parser IDE Veel documentatie ( o.a. Davy…) Extra’s: refactoring, semantische predicaten, multilanguage, web-support

52  Besluit ANTLR is zeer vriendelijk in gebruik
Extra mijl: booomparsers en parser IDE Veel documentatie ( o.a. Davy…) Extra’s: refactoring, semantische predicaten, multilanguage, web-support


Download ppt "ANother Tool for Language Recognition"

Verwante presentaties


Ads door Google