AuD
Lecture 'Algorithmen und Datenstrukturen' (code examples)
aud.example.expr.ExpressionParser2 Class Reference

Same as ExpressionParser but using modified grammar to provide the usual left-associative expressions. More...

+ Inheritance diagram for aud.example.expr.ExpressionParser2:
+ Collaboration diagram for aud.example.expr.ExpressionParser2:

Static Public Member Functions

static void main (String[] args)
 test and example for usage More...
 
static void main (String[] args)
 test and example for usage More...
 

Protected Member Functions

ExpressionTree sum (int level)
 parse sum More...
 
ExpressionTree product (int level)
 parse product More...
 
- Protected Member Functions inherited from aud.example.expr.ExpressionParser
String errorNear ()
 helper: generate a simple error message More...
 
int lookahead ()
 helper: "lookahead" is the usual phrasing More...
 
void nextToken ()
 helper: consume current token and advance to next token More...
 
String matchedText ()
 helper: get match corresponding to lookahead More...
 
void expect (int tokenid, String text)
 helper: check token (without calling nextToken!) More...
 
void verbose (int level, String message)
 helper: print out information More...
 
ExpressionTree expression (int level)
 parse expression More...
 
ExpressionTree sum (int level)
 parse sum More...
 
ExpressionTree product (int level)
 parse product More...
 
ExpressionTree factor (int level)
 parse factor More...
 

Additional Inherited Members

- Public Member Functions inherited from aud.example.expr.ExpressionParser
ExpressionTree parse (String input)
 parse input More...
 
void setVerbose (boolean b)
 set verbose mode (report state to System.err) More...
 

Detailed Description

Same as ExpressionParser but using modified grammar to provide the usual left-associative expressions.

Here is the "correct" grammar, that implements left-associative expressions, i.e., a+b+c=(a+b)+c and a*b*c=(a*b)*c.


expression ::= sum

sum        ::= product |
               sum '+' product | sum '-' product

product    ::= factor |
               product '*' factor | product '/' factor

factor     ::= number | symbol | '(' expression ')' |
               '+' factor | '-' factor

Important note: We cannot implement this directly with a recursive descent parser as this would result in an infinite recursion! (This type of recursion is generally referred to as left recursion and requires a transformation of the grammar.)

I don't go into details but provide a simple solution right ahead: model part of the recursion (the left recursion) using an iterative implementation. (Can you see how the transformed grammar would look like?)

See also
ExpressionParser

Definition at line 36 of file ExpressionParser2.java.

Member Function Documentation

◆ main()

static void aud.example.expr.ExpressionParser2.main ( String[]  args)
static

test and example for usage

Reimplemented from aud.example.expr.ExpressionParser.

Definition at line 110 of file ExpressionParser2.java.

110 {
111
112 String input=(args.length>0) ? args[0] : "a*b*c";
113
114 System.out.println("input = '"+input+"'");
115
116 ExpressionParser2 p=new ExpressionParser2();
117 p.setVerbose(true);
118 ExpressionTree tree=p.parse(input);
119
120 System.out.println("output = '"+tree+"'");
121
122 System.out.println(tree.postorder().toString());
123
124 System.out.println(tree.toTikZ());
125 }

References aud.example.expr.ExpressionParser.parse(), aud.BinaryTree< T >.postorder(), aud.example.expr.ExpressionParser.setVerbose(), aud.BinaryTreeTraversal< T >.Traversal.toString(), and aud.BinaryTree< T >.toTikZ().

+ Here is the call graph for this function:

◆ product()

ExpressionTree aud.example.expr.ExpressionParser2.product ( int  level)
protected

parse product


product ::= factor |
            product '*' factor | product '/' factor

Reimplemented from aud.example.expr.ExpressionParser.

Definition at line 82 of file ExpressionParser2.java.

82 {
83 verbose(level,"<product>");
84
85 // temporary storage
86 Queue<ExpressionTree> expr = new Queue<ExpressionTree>();
87 Queue<Integer> op = new Queue<Integer>();
88
89 ExpressionTree tree=factor(level+1);
90
91 // parse iteratively
92 while (lookahead()==Tokenizer.TIMES || lookahead()==Tokenizer.DIVIDE) {
93 op.enqueue(lookahead());
94 nextToken();
95 expr.enqueue(factor(level+1));
96 }
97
98 // setup tree
99 while (!op.is_empty()) {
100 if (op.dequeue()==Tokenizer.TIMES)
101 tree=new ExpressionTree(new Times(),tree,expr.dequeue());
102 else
103 tree=new ExpressionTree(new Divide(),tree,expr.dequeue());
104 }
105 return tree;
106 }
ExpressionTree factor(int level)
parse factor
int lookahead()
helper: "lookahead" is the usual phrasing
void verbose(int level, String message)
helper: print out information
void nextToken()
helper: consume current token and advance to next token

References aud.Queue< T >.dequeue(), aud.example.expr.Tokenizer.DIVIDE, aud.Queue< T >.enqueue(), aud.example.expr.ExpressionParser.factor(), aud.Queue< T >.is_empty(), aud.example.expr.ExpressionParser.lookahead(), aud.example.expr.ExpressionParser.nextToken(), aud.example.expr.Tokenizer.TIMES, and aud.example.expr.ExpressionParser.verbose().

Referenced by aud.example.expr.ExpressionParser2.sum().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ sum()

ExpressionTree aud.example.expr.ExpressionParser2.sum ( int  level)
protected

parse sum


sum ::= product |
        sum  '+' product | sum '-' product

Reimplemented from aud.example.expr.ExpressionParser.

Definition at line 50 of file ExpressionParser2.java.

50 {
51 verbose(level,"<sum>");
52
53 // temporary storage
54 Queue<ExpressionTree> expr = new Queue<ExpressionTree>();
55 Queue<Integer> op = new Queue<Integer>();
56
57 ExpressionTree tree=product(level+1);
58
59 // parse iteratively
60 while (lookahead()==Tokenizer.PLUS || lookahead()==Tokenizer.MINUS) {
61 op.enqueue(lookahead());
62 nextToken();
63 expr.enqueue(product(level+1));
64 }
65
66 // setup tree
67 while (!op.is_empty()) {
68 if (op.dequeue()==Tokenizer.PLUS)
69 tree=new ExpressionTree(new Plus(),tree,expr.dequeue());
70 else
71 tree=new ExpressionTree(new Minus(),tree,expr.dequeue());
72 }
73 return tree;
74 }
ExpressionTree product(int level)
parse product

References aud.Queue< T >.dequeue(), aud.Queue< T >.enqueue(), aud.Queue< T >.is_empty(), aud.example.expr.ExpressionParser.lookahead(), aud.example.expr.Tokenizer.MINUS, aud.example.expr.ExpressionParser.nextToken(), aud.example.expr.Tokenizer.PLUS, aud.example.expr.ExpressionParser2.product(), and aud.example.expr.ExpressionParser.verbose().

+ Here is the call graph for this function:

The documentation for this class was generated from the following file: