makeTokenParser
Parsecでparserの自動生成するときの最初の工程であるlexer作成につかう
GenLanguageDefを引数にとってGenTokenParserを返す
TokenParserはToken単位のparser
感覚としてはlexerに近いかもしれない
Text.Parsec.Tokenにある関数
makeTokenParser :: GenLanguageDef s u m -> GenTokenParser s u m
自作でGenTokenParserを作ることも可能ではある
たぶん普通はやらないと思うmrsekut.icon
makeTokenParserを利用せずに、自前でGenTokenParserを定義すればいい
ただ、設定項目が多くて面倒なので、それを緩和する方法として
GenLanguageDefとmakeTokenParserを用いた方法が用意されている
例
Text.Parsec.Languageを使えば、HaskellとかJavaのパーサーを秒で作れる
code:hs
import Text.Parsec
import qualified Text.Parsec.Token as P
import Text.Parsec.Language ( emptyDef )
lexer :: p.TokenParser()
lexer = P.makeTokenParser emptyDef
qualifiedを使ってas Pしてるのは、そのままimportしたら名前が被ってしまうから
Pの中にintegerという関数があるので、自分でintegerという名前の関数を定義できなくなる
このhaskellLexerが様々なparserを含んだレコードになっている
以下のようにして使う
作ったlexerの中からintegerというフィールドのパーサーにintegerという名前を付ける
code:hs
integer = P.integer lexer
-- parseTest integer "123"
-- > 123
emptyDefを拡張する
以下のようにして拡張して使う
code:hs
-- ref: http://m12i.hatenablog.com/entry/2013/11/13/023128
import Text.Parsec.Language
def = emptyDef
{ commentStart = "{-"
, commentEnd = "-}"
, identStart = letter
, identLetter = alphaNum
, opStart = oneOf "~&=:"
, opLetter = oneOf "~&=:"
, reservedOpNames = "&", "=", ":="
, reservedNames = [ "true"
, "false"
, "nop"
, "if"
, "then"
, "else"
, "fi"
, "while"
, "do"
, "od"
]
}
javaStyleを拡張してCのパーサーを作る
http://guppy.eng.kagawa-u.ac.jp/Seminar/Haskell/parsec.html
https://noritsugu.hatenablog.com/entry/20080925/parser
https://kei-os2007.hatenadiary.org/entry/20081126/1227709625
参考
Parsec makeTokenParser を使う。 : tnomuraのブログ
超わかりやすい
簡単な実装例も載っている