Я пишу синтаксический анализатор языка программирования, и я застрял в этом конфликте сдвига / уменьшения.
Вот состояние конфликта в файле parser.output, полученном при запуске бизона с -v
State 1
24 ident: TIDENT .
26 call: TIDENT . TLPAREN args TRPAREN
TLPAREN shift, and go to state 24
TLPAREN [reduce using rule 24 (ident)]
$default reduce using rule 24 (ident)
Конфликт возникает, когда я пытаюсь реализовать правило для вызова, похоже, он конфликтует с нормальным правилом идентификации.
Вот некоторые части грамматики (действия для простоты удалены, ноони не должны быть нужны. Также я не уверен, имеет ли значение порядок, в котором определяются правила, поправьте меня, если я ошибаюсь)
(заглавные буквы являются токенами)
Правило для идентификации просто
ident: TIDENT
;
Аргументы, используемые вызовом.
args: /* empty */
|
expr
|
args TCOMMA expr
;
Вызов для вызова функции
call:
TIDENT TLPAREN args TRPAREN
;
Expr для выражений
expr:
number
|
ternary
|
bool
|
string
|
ident
|
call
|
TLPAREN expr TRPAREN
|
expr TPLUS expr
|
expr TMINUS expr
|
expr TSLASH expr
|
expr TSTAR expr
|
expr TGT expr
|
expr TGE expr
|
expr TLT expr
|
expr TLE expr
;
Вопрос: почему у грамматики конфликт сдвига / уменьшения и как вы это исправляете?Я видел похожие парсеры стилей, у которых нет конфликтов, это действительно странно.
Если вам нужна полная грамматика для воспроизведения, вот хастебин https://hasteb.in/zozifopi.shell
Если вам нужны подробностиобо всем остальном, пожалуйста, дайте мне знать в комментариях, и я отредактирую вопрос соответственно.