parser generation
TRANSCRIPT
![Page 1: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/1.jpg)
Parser Generation
Prof. Dr. Ralf Lämmel Universität Koblenz-Landau Software Languages Team
Mainly with applications to !language processing
![Page 2: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/2.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Program generation
Specification ProgramProgram generator
![Page 3: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/3.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Parser generation
Grammar!with some !
codeParser
Program generator
![Page 4: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/4.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Generative programming
Generative programming is a style of computer programming that uses automated source code creation through generic frames, classes, prototypes, templates, aspects, and code generators to improve programmer productivity ... It is often related to code-reuse topics such as component-based software engineering and product family engineering.
Retrieved from Wikipedia!on 3 May, 2011.
![Page 5: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/5.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Language processing patterns
manual patterns
generative patterns
1. The Chopper Pattern!2. The Lexer Pattern!3. The Copy/Replace Pattern!4. The Acceptor Pattern!5. The Parser Pattern!6. The Lexer Generation Pattern!7. The Acceptor Generation Pattern!8. The Parser Generation Pattern!9. The Text-to-object Pattern!10.The Parser Generation2 Pattern!11.(The Text-to-tree Pattern)!12.(The Tree-walk Pattern)!13.The Object-to-text Pattern
![Page 6: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/6.jpg)
The Lexer Generation Pattern
See !the Lexer Pattern!for comparison
![Page 7: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/7.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Lexer Generation Pattern
Intent: Analyze text at the lexical level. Use token-level grammar as input.!
Operational steps (compile time):!
1.Generate code from the lexer grammar.!
2.Write boilerplate code to drive the lexer.!
3.Write code to process token/lexeme stream.!
4.Build generated and hand-written code.
![Page 8: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/8.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Token-level grammar for 101
COMPANY : 'company';DEPARTMENT : 'department';EMPLOYEE : 'employee';MANAGER : 'manager';ADDRESS : 'address';SALARY : 'salary';OPEN : '{';CLOSE : '}';STRING : '"' (~'"')* '"';FLOAT : ('0'..'9')+ ('.' ('0'..'9')+)?;WS : (' '|'\r'? '\n'|'\t')+;
![Page 9: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/9.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Lexer generation
....g ....javaANTLR
![Page 10: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/10.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
ANTLR
“ANTLR, ANother Tool for Language Recognition, is a language tool that provides a framework for constructing recognizers, interpreters, compilers, and translators from grammatical descriptions containing actions in a variety of target languages. ANTLR provides excellent support for tree construction, tree walking, translation, error recovery, and error reporting.” !!http://www.antlr.org/
![Page 11: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/11.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Boilerplate code for lexer execution
FileInputStream stream = new FileInputStream(file); ANTLRInputStream antlr = new ANTLRInputStream(stream); MyLexer lexer = new MyLexer(antlr); Token token; while ((token = lexer.nextToken()) !=Token.EOF_TOKEN) {
...}
Grammar-derived class
![Page 12: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/12.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:antlrLexer
![Page 13: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/13.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Define regular expressions for all tokens.!
Generate code for lexer.!
Set up input and token/lexeme stream.!
Implement operations by iteration over pairs.!
Build generated and hand-written code.
Summary of implementation aspects
![Page 14: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/14.jpg)
The Acceptor Generation Pattern
See !the Acceptor Pattern!
for comparison
![Page 15: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/15.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Acceptor Generation Pattern
Intent: Verify syntactical correctness of input. Use context-free grammar as input.!
Operational steps (compile time):!
1.Generate code from the context-free grammar.!
2.Write boilerplate code to drive the acceptor (parser).!
3.Build generated and hand-written code.
![Page 16: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/16.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
company : 'company' STRING '{' department* '}' EOF; department : 'department' STRING '{' ('manager' employee) ('employee' employee)* department* '}';!employee : STRING '{' 'address' STRING 'salary' FLOAT '}';
Wanted: a generated acceptor
Context-free grammar for 101
![Page 17: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/17.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Parser generation
.g
...Lexer.java
...Parser.java
ANTLR
![Page 18: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/18.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Driver for acceptor
import org.antlr.runtime.*;!public class Test { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); SetyLexer lexer = new ...Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ...Parser parser = new ...Parser(tokens); parser....(); }}
This is basically boilerplate code. Copy and Paste!
![Page 19: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/19.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Driver for acceptor
import org.antlr.runtime.*;!public class Test { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); SetyLexer lexer = new ...Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ...Parser parser = new ...Parser(tokens); parser....(); }}
Prepare System.in as ANTLR input
stream
![Page 20: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/20.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Driver for acceptor
import org.antlr.runtime.*;!public class Test { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); SetyLexer lexer = new ...Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ...Parser parser = new ...Parser(tokens); parser....(); }} Set up lexer !
for language
![Page 21: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/21.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Driver for acceptor
import org.antlr.runtime.*;!public class Test { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); SetyLexer lexer = new ...Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ...Parser parser = new ...Parser(tokens); parser....(); }}
Obtain token stream from lexer
![Page 22: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/22.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Driver for acceptor
import org.antlr.runtime.*;!public class Test { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); SetyLexer lexer = new ...Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ...Parser parser = new ...Parser(tokens); parser....(); }} Set up parser and
feed with token stream of lexer
![Page 23: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/23.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Driver for acceptor
import org.antlr.runtime.*;!public class Test { public static void main(String[] args) throws Exception { ANTLRInputStream input = new ANTLRInputStream(System.in); SetyLexer lexer = new ...Lexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ...Parser parser = new ...Parser(tokens); parser....(); }} Invoke start
symbol of parser
![Page 24: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/24.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:antlrAcceptor
![Page 25: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/25.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Define regular expressions for all tokens.!
Define context-free productions for all nonterminals.!
Generate code for acceptor (parser).!
Set up input and token/lexeme stream.!
Feed parser with token stream.!
Acceptor (parser) execution = call start symbol.!
Build generated and hand-written code.
Summary of implementation aspects
![Page 26: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/26.jpg)
The Parser Generation Pattern
See !the Parser Pattern!for comparison
![Page 27: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/27.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Parser Generation Pattern
Intent: Enable structure-aware functionality. Use context-free grammar as the primary input.!
Operational steps (compile time):!1.Include semantic actions into context-free
grammar.!
2.Generate code from enhanced grammar.!
3.Write boilerplate code to drive the parser.!
4.Build generated and hand-written code.
![Page 28: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/28.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
A grammar rule with a semantic action
employee : STRING '{' 'address' STRING 'salary' s=FLOAT { total += Double.parseDouble($s.text); } '}';
Semantic actions are enclosed
between braces.
Variable local to parser execution
Retrieve and parse lexeme for the number
![Page 29: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/29.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:antlrParser
![Page 30: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/30.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Parser descriptions can also use “synthesized” attributes.
Add synthesized attributes to nonterminals. Add semantic actions to productions. !expr returns [int value] : e=multExpr {$value = $e.value;} ( '+' e=multExpr {$value += $e.value;} | '-' e=multExpr {$value -= $e.value;} )*; !(Context-free part in bold face.)
Compute an int value
Perform addition & Co.
![Page 31: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/31.jpg)
The Text-to-object Pattern
Use parsing !for AST construction
![Page 32: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/32.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Text-to-object Pattern
Intent: Enable structure-aware OO programs. Build AST objects along parsing. Operational steps (compile time):!1.Define object model for AST.!
2.Instantiate Parser Generation pattern as follows: Use semantic actions for AST construction.
AST Abstract Syntax Tree
![Page 33: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/33.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Acceptor---for comparison
company :
'company' STRING '{'
department*
'}'
EOF;
![Page 34: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/34.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
With semantic actions for object construction included
company returns [Company c]: { $c = new Company(); } 'company' STRING { $c.setName($STRING.text); } '{' ( topdept= department { $c.getDepts().add($topdept.d); } )* '}' ;
Construct company object.
Set name of company.
Add all departments.
![Page 35: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/35.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:antlrObjects
![Page 36: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/36.jpg)
The Parser Generation2 Pattern !
(That is, the Parser Generation Generation Pattern.)
See !the Parser Pattern!
and!the Parser Generation Pattern!
for comparison
![Page 37: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/37.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Parser Generation2 Pattern
Intent: Enable structure-aware OO programs. Build AST objects along parsing. Use idomatic context-free grammar as the only input.!Operational steps (compile time):!
1.Author idiomatic context-free grammar.!
2.Generate object model from context-free grammar.!
3.Generate enhanced grammar for AST construction.!
4.Generate parser and continue as before.
![Page 38: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/38.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
More declarative parser generation
idiomatic!grammar
Program generator
....g
....java
object model
![Page 39: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/39.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Idiomatic grammar for 101
Company : ...;!!Department : !
'department' dname=QqString '{' !! 'manager' manager=Employee! !! subdepartments=Department* !
!! employees=NonManager* !!'}';!
!NonManager : ...;!Employee : ...;
Label all nonterminal occurrences
Leverage predefined token-level grammar
![Page 40: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/40.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:yapg
![Page 41: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/41.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Bootstrapping1.Develop ANTLR-based parser for idiomatic
grammars.!
2.Develop object model for ASTs for idiomatic grammars.!
3.Develop ANTLR generator.!
4.Develop object model generator.!
5.Define idiomatic grammar of idiomatic grammars.!
6.Generate grammar parser from said grammar.!
7.Generate object model from said grammar.!
![Page 42: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/42.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The grammar of grammars
Grammar ! ! : prods=Production*;!
Production ! : lhs=Id ':' rhs=Expression ';';!
Expression !: Sequence | Choice;!
Sequence !! : list=Atom*;!
Choice !! ! : first=Id rest=Option*;!
Atom! ! ! ! : Terminal | Nonterminal | Many;!
Terminal !! : symbol=QString;!
Nonterminal !: label=Id '=' symbol=Id;!
Option !! ! : '|' symbol=Id;!
Many ! ! ! : elem=Nonterminal '*';
![Page 43: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/43.jpg)
The Text-to-tree Pattern
Use trees rather than POJOs!for AST construction !
along parsing
Mentioned in passing
![Page 44: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/44.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Text-to-tree Pattern
Intent: Enable structure-aware grammar-based programs. Build AST trees along parsing. Use grammar with tree construction actions as input. !
Operational steps (compile time):!1.Author grammar with tree construction actions.!
2.Generate parser.
Advanced stuff!
![Page 45: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/45.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Tree construction with ANTLR
department :! 'department' name=STRING '{' ! manager! ('employee' employee)*! department*! '}'! -> ^(DEPT $name manager employee* department*)! ;
ANTLR’s special semantic actions for tree construction
![Page 46: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/46.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:antlrTrees
![Page 47: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/47.jpg)
The Tree-walk Pattern
Mentioned in passing
![Page 48: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/48.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
The Tree-walk Pattern
Intent: Operate on trees in a grammar-based manner. Productions describe tree structure. Semantic actions describe actions along tree walking. !
Operational steps (compile time):!1.Author tree grammar (as opposed to CFG).!
2.Add semantic actions.!
3.Generate and build tree walker.
Advanced stuff!
![Page 49: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/49.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Total: Tree walking with ANTLRcompany :! ^(COMPANY STRING dept*)! ;! !dept :! ^(DEPT STRING manager employee* dept*)! ;! !manager : ! ^(MANAGER employee)! ; ! !employee :! ^(EMPLOYEE STRING STRING FLOAT)! { total += Double.parseDouble($FLOAT.text); }! ;
Matching trees !rather than
parsing text.
Semantic actions as before.
![Page 50: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/50.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Cut: Tree walking with ANTLR
Match trees
Rebuild tree
topdown : employee;! !employee :! ^(EMPLOYEE STRING STRING s=FLOAT)! -> ^(EMPLOYEE ! STRING! STRING! FLOAT[! Double.toString(! Double.parseDouble(! $s.text) / 2.0d)])! ;
Tree walking strategy
![Page 51: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/51.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
Demo
http://101companies.org/wiki/Contribution:antlrTrees
![Page 52: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/52.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
SummaryLanguage processing is a programming domain.!
Grammars are program specifications in that domain.!
Those specifications may be enhanced semantically.!
Those specifications may also be constrained idiomatically.!
Manual implementation of such specifications is not productive. !
Parser generators automatically implement such specifications.!
Parser generation is an instance of generative programming.
![Page 53: Parser Generation](https://reader030.vdocuments.site/reader030/viewer/2022012123/61ddfbc40cdcd33303485413/html5/thumbnails/53.jpg)
(C) 2010-2014 Prof. Dr. Ralf Lämmel, Universität Koblenz-Landau (where applicable)
A development cycle for language-based tools
1.Author language samples.!
2.Complete samples into test cases.!
3.Author the EBNF for the language.!
4.Refine EBNF into acceptor (using generation or not).!
5.Build and test the acceptor.!
6.Extend the acceptor with semantic actions.!
7.Build and test the language processor.
Some bits of !software engineering