Я использую PLY для создания синтаксического анализатора для своего языка, однако у меня есть конфликт сдвига/уменьшения, который вызывает у меня некоторые проблемы. В моем языке есть универсальные типы с синтаксисом, похожим на шаблоны C++. Итак, прямо сейчас у меня есть такие правила, как:
expression : expression LESS expression %prec COMPARISON
expression : template
template : NAME
| NAME LESS templates GREATER
templates : template
| templates COMMA template
Однако я обнаружил, что он не может разобрать:
a < 2
(что является проблемой по понятным причинам). Ниже приведен вывод отладки:
PLY: PARSE DEBUG START
State : 0
Stack : . <Token: 'NAME' 'a'>
Action : Shift and goto state 42
State : 42
Stack : NAME . <Token: 'LESS' '<'>
Action : Shift and goto state 81
State : 81
Stack : NAME LESS . <Token: 'NUMBER' '2'>
ERROR: Error : NAME LESS . <Token: 'NUMBER' '2'>
Если нужно больше моего парсера, я могу его предоставить. Спасибо.
РЕДАКТИРОВАТЬ: одно из предложенных мне решений заключалось в том, чтобы сделать типы собственным токеном. Это потребует небольшой работы, потому что мой язык не использует систему включения препроцессора, такую как C / C ++, однако я думаю, что это все же возможно, однако я бы предпочел решение, ограниченное грамматикой.