我在以下语法上遇到了减少/减少冲突(摘录)
declaration : type list_of_id
list_of_id : ID
| list_of_id ',' ID
;
type : PATH
| SCAL
;
assignment : ID ":=" param
| ID ":=" expr
param : point relative_param
| ID relative_param
point : '(' expr ',' expr ')'
| '(' expr ':' expr ')'
relative_param : /* empty rule */
| "--" '+' param
| "--" CYCLE relative_param
| "--" param
expr : NB
| ID ``
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '(' expr ')'
我看到当输入是 : foo := bar 时,有两种可能的推导:
- 赋值-> ID ":=" 参数和参数-> ID
- assignment-> ID ":=" expr 和 expr-> ID
我在语法中使用了两次 ID,因为变量可以是 path 类型或 scal 类型。如何在不使用 glr-parser 选项的情况下消除此冲突?
我试图将 ID 拆分为两种可能性: ID_PATH 和 ID_SCAL 并将产品参数和 expr 更改为:
param : point relative_param
| ID_PATH relative_param
;
expr : NB
| ID_SCAL
| expr '+' expr
| expr '-' expr
| expr '/' expr
| '(' expr ')'
但在这种情况下,我如何在词法分析器中区分这两个(ID_SCAL 和 ID_PATH)?