型付き式と変数アクセスを含む文法に苦労しています。このアクセスの結果タイプは、解析中に確認できず、2番目のステップで評価されます。この評価は問題ではありませんが、明確なパーサールールを作成するのは難しいようです。
異なるタイプで機能するすべての操作(比較演算子など)は、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 */
ご協力いただきありがとうございます。