Happyの%tokenではより一般的な形式を下にしなきゃだめ
正誤
正しい
%token
...
...
natType { (TokenAnIdent "Nat", _) }
boolType { (TokenAnIdent "Bool", _) }
ident { (TokenAnIdent $$, _) }
誤り
%token
...
ident { (TokenAnIdent $$, _) }
...
natType { (TokenAnIdent "Nat", _) }
boolType { (TokenAnIdent "Bool", _) }
これはhappy製の単純型付きラムダ計算パーサーの、トークン宣言部です。
「正しい」のようにしないと、このような実行時エラーが起きます。
>>> parse "\\x:Nat.10"
got a token "Nat",
but [natType, boolType] are expected.
"Nat" near_equal natType
ですが、先にidentの方にマッチするために、"Nat"がidentだと判断されています 🤘🙄🤘