Я борюсь с грамматикой, которая включает в себя типизированные выражения, а также переменный доступ. Тип результата этого доступа не определяется во время разбора и оценивается на втором этапе. Эта оценка не является проблемой, но, похоже, трудно написать однозначные правила парсера.уменьшить/уменьшить конфликты с помощью ocamlyacc
Все операции, которые работают на разных типах (например, сравнение операторов), приводят к конфликту reduce/reduce
. Ясно, что это объясняется тем, что анализатор не может решить, следует ли анализировать «x.a = y.b
» как «bool_expr EUQAL bool_expr
» или как «num_expr EUQAL num_expr
», потому что тип неопределен. Однако тип результата правила comp_op
определен (как всегда булево значение).
Есть ли какое-либо решение этой проблемы, не отбрасывая информацию о типе во время разбора и всегда проверяя его на этапе оценки?
Вот сокращенный пример грамматики (с использованием ocamllex и ocamlyacc):
comp_op:
| bool_expr EQUAL bool_expr { T.Equiv (T.Wrapper $1, T.Wrapper $3) }
| num_expr EQUAL num_expr { T.Equiv (T.Wrapper $1, T.Wrapper $3) }
/* the wrapper type basically just wraps the expressions to get a common type */
bool_expr:
| TRUE { T.Bool true }
| FALSE { T.Bool false }
| access { T.BoolAccess $1 }
num_expr:
| NUMBER { T.Num $1 }
| access { T.NumAccess $1 }
access:
/* some more complex rules describing the access to variables */
Спасибо за вашу помощь.
Почему вы хотите смешивать парсинг и печатать? Я думаю, что лучше рассмотреть этот вопрос в качестве примера «почему бы не сделать это». – ygrek