Я использовал 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 ++, однако я думаю, что это все еще возможно, однако я бы предпочел решение, ограниченное грамматикой.