generated at
makeTokenParser
Parsecでparserの自動生成するときの最初の工程であるlexer作成につかう
GenLanguageDefを引数にとってGenTokenParserを返す
TokenParserはToken単位のparser
感覚としてはlexerに近いかもしれない
Text.Parsec.Tokenにある関数
makeTokenParser :: GenLanguageDef s u m -> GenTokenParser s u m


自作でGenTokenParserを作ることも可能ではある
たぶん普通はやらないと思うmrsekut
makeTokenParserを利用せずに、自前でGenTokenParserを定義すればいい
ただ、設定項目が多くて面倒なので、それを緩和する方法として
GenLanguageDefmakeTokenParserを用いた方法が用意されている



Text.Parsec.Languageを使えば、HaskellとかJavaのパーサーを秒で作れる
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という名前を付ける
hs
integer = P.integer lexer -- parseTest integer "123" -- > 123
emptyDefを拡張する
以下のようにして拡張して使う
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のパーサーを作る




参考
超わかりやすい
簡単な実装例も載っている