Я борюсь с грамматикой, которая включает напечатанные выражения , а также доступ к переменной . Тип результата этого доступа не может быть определен во время синтаксического анализа и оценивается на втором этапе. Эта оценка не является проблемой, но, кажется, сложно написать однозначные правила синтаксического анализа.
Все операции, которые работают с разными типами (например, операторы сравнения), вызывают конфликт 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 */
Спасибо за вашу помощь.