Мы используем GPPG (по сути, бизон для C #) для генерации парсера для языка программирования.Все идет отлично, за исключением одного действительно неприятного кусочка.Язык, который мы анализируем, имеет своего рода правило «неявного сравнения», где «выражение-выражение» следует интерпретировать как «выражение == выражение».
Например, это совершенно правильное утверждение:
If SomeValue False Then
EndIf
Это, очевидно, создает всевозможные конфликты при генерации парсера.Моя первая попытка их решения шла по этим направлениям (отредактировано для краткости).Я попытался провести некоторый рефакторинг правил, и это больше не кажется двусмысленным, но я просто упускаю что-то очевидное.
Вот очень маленькая грамматика, которая показывает конфликт, который я имеюи как я пытался ее решить, не работает, хотя
%start program
%token <Token> Plus
%token <Token> Times
%token <Constant> Constant
%left Plus
%left Times
%left IMPLICIT_COMPARISON
%%
program: expression;
expressionBase: Constant
| expression Plus expression
| expression Times expression;
expression: expressionBase
| expression expressionBase %prec IMPLICIT_COMPARISON;
%%
Любая помощь будет принята с благодарностью