makeTokenParser
TokenParserはToken単位のparser
感覚としてはlexerに近いかもしれない
makeTokenParser :: GenLanguageDef s u m -> GenTokenParser s u m
たぶん普通はやらないと思うmrsekut.icon
ただ、設定項目が多くて面倒なので、それを緩和する方法として
例
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
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のパーサーを作る
参考
超わかりやすい
簡単な実装例も載っている