2020/1/12 AlexとHappyで遊んでみる
#ログ系
本家のページのIntroductionにサンプルがあったのでコレを進めてみる
ref Alex#5cf7866e1982700000213af5
Happyがないと実際に動くところをみるのはムズイっぽいな、しらんけど
このリポジトリをcloneして遊んでみることにした
$ alex Lexer.xしたら秒で4000行ほどのLexer.hsが生成された
これを使ってみたかったので無理やり動かしてみたがよくわからんかった
文字列をByteString.ByteStringに変換する関数を定義
code:hs
import qualified Data.Text as T
import Data.Text.Encoding ( encodeUtf8 )
-- string2BS :: String -> ByteString.ByteString
string2BS s = B.fromStrict $ (encodeUtf8 . T.pack) s
code:ghci
runAlex (string2BS "let hoge = 10 in hoge + 5") alexGetInput
Right (AlexPn 0 1 1,'\n',"let hoge = 10 in hoge + 5",0)
後にGHC拡張のOverloadedStringsを使えばもっと簡単にできることを知った
わからんので次はHappyを触ってみる
$ happy Parser.yでParser.hsを生成
この時点でghciでmainを読み込めばもう動く
Wrapper.hsの中でparse関数が定義されているが、明らかに引数sはStringっぽいのに、なんでByteStringになるんだろう #??
だってMain.hsの下の方の"1 + 2 + 3"がそれだろ?なんで?
Main.hsの1行目の{-# LANGUAGE OverloadedStrings #-}こいつのパワーか
良い感じに使えるようになった
手順
ghciでMain.hsを読み込む
>>> :set -XOverloadedStringsでStringをByteStringで読み込めるようにする
>>> runAlex "1+1" happyParserとかで遊べる!!
https://github.com/ghulette/happy-example
これもミニマルな例として良さそう
http://dev.stephendiehl.com/fun/008_extended_parser.html
通しで色々書いてる資料
#??
ルールを知りたい
docsに書いてるmrsekut.icon
Data.ByteString.Lazy.Internal.ByteStringがわからん
LexerのルールとParserのルールは当たり前に揃えないと動かないと思うけど、どのへんを頑張ればいい?
整合性はどうやって担保する?
例えば自作の文法を定義したときにそれが正しく動くものだとどうやって検証する?
思考の順番としては、
happyで構文木を作る
happyで↑で使ったtokenを定義する
alexを↑に合わせて作る
tokenの型を定義する
Haskellコード部
なのか?mrsekut.icon