Решение конфликтов вывода / вывода в YACC / ocamlyacc

я пытаюсь разбирать грамматику в ocamlyacc (почти то же, что и обычные yacc), который поддерживает функции приложения без операторов (в Ocaml или Haskell), и обычный ассортимент бинарные и унарные операторы. Я получаю уменьшить/уменьшить конфликт с '-' оператор, который может быть использован как для вычитания и отрицание. Вот пример из грамматики я использую:

%token <int> INT
%token <string> ID
%token MINUS

%start expr
%type <expr> expr

%nonassoc INT ID
%left MINUS
%left APPLY

%%

expr: INT
    { ExprInt  }
| ID
    { ExprId  }
| expr MINUS expr
    { ExprSub(, ) }
| MINUS expr
    { ExprNeg  }
| expr expr %prec APPLY
    { ExprApply(, ) };

проблема В том, что когда вы получите выражение, как "a - b" парсер не знаю, должно ли это быть снижена, так как "a-b" (отрицание b, с последующим нанесением) или "a - b" (вычитание). Вычитание снижение правильно. Как мне решить конфликт в пользу того, что правила?

Найдено 2 ответа:

Resolving reduce/reduce conflict in yacc/ocamlyacc

http://stackoverflow.com/questions/24516/resolving-reduce-reduce-conflict-in-yacc-ocamlyacc

Посмотреть решение →