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だと判断されています 🤘🙄🤘

実際の修正例

筆者プロフィール

my-latest-logo

aiya000(あいや)

せつラボ 〜圏論の基本〜」 「せつラボ2~雲と天使と関手圏~」 「矢澤にこ先輩といっしょに代数!」を書いています!

強い静的型付けとテストを用いて、バグを防ぐのが好き。Haskell・TypeScript。