五、ANTLR 4 语法分析器

语法分析

二异性文法

若文法G对同一句子产生不止一棵分析树,则称G是二义的。

If-Then-Else的二异性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//IfStat.g4
stat : 'if' expr 'then' stat
| 'if' expr 'then' stat 'else' stat
| expr
;
->
//IfStatOpenMatched.g4
stat : matched_stat | open_stat
matched_stat : 'if' expr 'then' matched_stat 'else' matched_stat
| expr
;
open_stat : 'if' expr 'then' stat
| 'if' expr 'then' matched_stat 'else' open_stat
;

运算符结合性与优先级带来的二异性

1
2
3
4
5
6
7
8
9
10
11
12
13
//Expr.g4
expr :
| expr '*' expr
| expr '-' expr
;

//ExprAssoc.g4
expr :
| '!' expr
| <assoc = right> expr '^' expr
| DIGIT
;
//右结合运算符,前缀运算符与后缀运算符的结合性
左递归(左结合)
1
2
3
4
5
6
7
8
9
expr : expr '-' term
| term
;

term : term '*' factor
| factor
;

factor : DIGIT ;
右递归(右结合)
1
2
3
4
5
6
7
8
9
10
11
12
13
expr : term expr_prime ;

expr_prime : '-' term expr_prime
|
;

term : factor term_prime ;

term_prime : '*' factor term_prime
|
;

factor : DIGIT