The Lexer
Our initial language has very simple lexical syntax.
integer: 1
, -2
, 42
integer :: Parser Integer
integer = Tok.integer lexer
float: 3.14
, 2.71
, 0.0
float :: Parser Double
float = Tok.float lexer
identifier: a
, b
, foo
, ncc1701d
identifier :: Parser String
identifier = Tok.identifier lexer
And several tokens which enclose other token(s) returning a compose expression.
parens :: Parser a -> Parser a
parens = Tok.parens lexer
semiSep :: Parser a -> Parser [a]
semiSep = Tok.semiSep lexer
commaSep :: Parser a -> Parser [a]
commaSep = Tok.commaSep lexer
Lastly our lexer requires that several tokens be reserved and not used as identifiers, we reference these as separately.
reserved: def
, extern
reservedOp: +
, *
, -
, ;
reserved :: String -> Parser ()
reserved = Tok.reserved lexer
reservedOp :: String -> Parser ()
reservedOp = Tok.reservedOp lexer
Putting it all together we have our Lexer.hs
module.
module Lexer where
import Text.Parsec.String (Parser)
import Text.Parsec.Language (emptyDef)
import qualified Text.Parsec.Token as Tok
lexer :: Tok.TokenParser ()
lexer = Tok.makeTokenParser style
where
ops = ["+","*","-",";"]
names = ["def","extern"]
style = emptyDef {
Tok.commentLine = "#"
, Tok.reservedOpNames = ops
, Tok.reservedNames = names
}
integer :: Parser Integer
integer = Tok.integer lexer
float :: Parser Double
float = Tok.float lexer
parens :: Parser a -> Parser a
parens = Tok.parens lexer
commaSep :: Parser a -> Parser [a]
commaSep = Tok.commaSep lexer
semiSep :: Parser a -> Parser [a]
semiSep = Tok.semiSep lexer
identifier :: Parser String
identifier = Tok.identifier lexer
reserved :: String -> Parser ()
reserved = Tok.reserved lexer
reservedOp :: String -> Parser ()
reservedOp = Tok.reservedOp lexer
当前内容版权归 Stephen Diehl 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 Stephen Diehl .