Я получаю конфликт уменьшения/уменьшения в следующей грамматике (отрывок)
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
- присваивание-> ID ":=" expr и expr-> ID
Я дважды использовал ID в грамматике, потому что переменная может иметь тип path или scal. Как я могу устранить этот конфликт без использования опции glr-parser?
Я попытался разделить идентификатор на две возможности: 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) в лексере?