我正在为涉及类型表达式和变量访问的语法而苦苦挣扎。此访问的结果类型在解析期间无法确定,并在第二步中进行评估。这种评估不是问题,但似乎很难编写明确的解析器规则。
所有适用于不同类型的操作(例如比较运算符)都会产生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 */
谢谢你的帮助。