Happy
日本語版
examples
シンプルなもの
大きいもの
Haskellをhappyで書いている感じ
どうやったらこんなの正確に書けるんだ..mrsekut.icon
コマンド
$ happy parser.y
parser.hsがが生成される
$ happy parser.y -i
parser.infoというファイルが生成されてデバッグに役立つ
{}に囲まれた部分はそのまま.hsに出力する
%でルールっぽいやつを指定
code:y
%name calc // parserの名前
%tokentype { Token } // parserの引数になる型
%error { parseError }
このときparserはcalc :: [Token] -> Tという型になる
Tは%tokenで指定するルール
%token
parserの返り値になるTを指定
%lexer
%monad
%%以下に生成規則を定義
parseErrorの関数の定義を含めないといけない
code:hs
parseError _ = error "Parse error"
下部ではHaskellの中でのASTのデータ型を定義する
生成規則と似てはいるが、異なるものなので定義する必要がある
%nonassoc
code:y
nonassocは並べられた演算子が同時に使用できないことを示す
varとかintって予約語だっけ?
code:y
list : {- empty -} { [] }
| Exp ',' list { $1 : $3 }
| Exp { $1 : [] }
Happy内での関数の作り方
構造は同じだけど型が異なるために、var, int, bool分のListのparserルールを別々に書いているのが無駄に見える
そういえばなんでParser側で「読む文字」を指定してるんだ?
'+'とか。
Lexerの出力を受け取るわけではないのか
直感的に考えればTokenの指定だけでよいはず
なので.xと同じ様な定義を2回書く羽目になっている
関数呼び出しvar Expのようなものの優先度はどう指定する?
=や+のように記号がないので指定の仕方がわからない
あー、termみたいにツリーで優先度を指定する?
tokenって何のために書いてる?何するために使っている?
エラー報告