Hängendes else
dangling else
Klassisches Problem von Mehrdeutigkeit beim Parsen
© Theo Ruys
37
VB HC 4
ANTLR - Introduction
Operator Precedence (2)
expr1 : expr2 ((PLUS^ | MINUS^) expr2)*
expr2 : operand (TIMES^ operand)*
operand : IDENTIFIER
a + b * c - d
expr1
expr2 expr2 expr2 PLUS^ MINUS^
operand
ID
a
operand operand
ID
b
ID
c
operand
ID
d
TIMES^
parse tree:
PLUS
MINUS
ID
a
ID
b
ID
c
ID
d
TIMES
constructed AST:
© Theo Ruys
38
VB HC 4
ANTLR - Introduction
Greedy (1)
• Consider the classic if-then-else ambiguity (i.e., dangling else)
stat : 'if' expr 'then' stat ('else' stat)?
| ... ;
if b1 then if b2 then s1 else s2
e.g.
if
then if
then else
b1
s1 b2 s2
stat
stat
if
then if
then
else
b1
s1 b2
s2
stat
stat
Two possible parse trees:
© Theo Ruys
39
VB HC 4
ANTLR - Introduction
Greedy (2)
warning(200): Foo.g:12:33: Decision can match input
such as "'else'" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that
input
stat : 'if' expr 'then' stat
(options {greedy=true;} : 'else' stat)?
| ... ;
• If you make it clear to ANTLR that you want the subrule to match
greedily (i.e. the default behavior), ANTLR will not generate the
warning.
• So this ambiguity (which statement should the “else” be attached to)
results in a parser nondeterminism. ANTLR 3 warns you:
Note: this is the way it should work according to the
documentation. However, ANTLR 3 still shows the warning.
(Note that the generated compiler will work correctly though)
Zwei mögliche Parse-Bäume. ANTLR tut automatisch das richtige (1. Baum), da ?
greedy ist.
© Theo Ruys
37
VB HC 4
ANTLR - Introduction
Operator Precedence (2)
expr1 : expr2 ((PLUS^ | MINUS^) expr2)*
expr2 : operand (TIMES^ operand)*
operand : IDENTIFIER
a + b * c - d
expr1
expr2 expr2 expr2 PLUS^ MINUS^
operand
ID
a
operand operand
ID
b
ID
c
operand
ID
d
TIMES^
parse tree:
PLUS
MINUS
ID
a
ID
b
ID
c
ID
d
TIMES
constructed AST:
© Theo Ruys
38
VB HC 4
ANTLR - Introduction
Greedy (1)
• Consider the classic if-then-else ambiguity (i.e., dangling else)
stat : 'if' expr 'then' stat ('else' stat)?
| ... ;
if b1 then if b2 then s1 else s2
e.g.
if
then if
then else
b1
s1 b2 s2
stat
stat
if
then if
then
else
b1
s1 b2
s2
stat
stat
Two possible parse trees:
© Theo Ruys
39
VB HC 4
ANTLR - Introduction
Greedy (2)
warning(200): Foo.g:12:33: Decision can match input
such as "'else'" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that
input
stat : 'if' expr 'then' stat
(options {greedy=true;} : 'else' stat)?
| ... ;
• If you make it clear to ANTLR that you want the subrule to match
greedily (i.e. the default behavior), ANTLR will not generate the
warning.
• So this ambiguity (which statement should the “else” be attached to)
results in a parser nondeterminism. ANTLR 3 warns you:
Note: this is the way it should work according to the
documentation. However, ANTLR 3 still shows the warning.
(Note that the generated compiler will work correctly though)
| WS 2014/15 | A. Koch | FG ESA | 38 / 45
Compiler 1 Einleitung Parser und Listener-Interface Expressions und Visitor-Interface Fortgeschrittene Themen Zusammenfassung