我不太清楚还有其他问题。我认为我需要这里的一般指导。我有这样的事情:复杂的Parsec解析器
expr = buildExpressionParser table term
<?> "expression"
term = choice [
(float >>= return . EDouble)
, try (natural >>= return . EInteger)
, try (stringLiteral >>= return . EString)
, try (reserved "true" >> return (EBool True))
, try (reserved "false" >> return (EBool False))
, try assign
, try ifelse
, try lambda
, try array
, try eseq
, parens expr
]
<?> "simple expression"
当我测试解析器,我主要是让问题...就像当我尝试解析
(a,b) -> "b"
它是由lambda
解析器接受,但expr
解析器讨厌它。有时它甚至完全停留在永恒的规则中。
我已阅读Write Yourself a Scheme,但它只解析Scheme的同质源。
也许我一般都在想错方向。
编辑:这里的内部解析器:
assign = do
i <- identifier
reservedOp "="
e <- expr
return $ EAssign i e
ifelse = do
reserved "if"
e <- expr
reserved "then"
a <- expr
reserved "else"
b <- expr
return $ EIfElse e a b
lambda = do
ls <- parens $ commaSep identifier
reservedOp "->"
e <- expr
return $ ELambda ls e
array = (squares $ commaSep expr) >>= return . EArray
eseq = do
a <- expr
semi <|> (newline >>= (\x -> return [x]))
b <- expr
return $ ESequence a b
table = [
[binary "*" EMult AssocLeft, binary "/" EDiv AssocLeft, binary "%" EMod AssocLeft ],
[binary "+" EPlus AssocLeft, binary "-" EMinus AssocLeft ],
[binary "~" EConcat AssocLeft],
[prefixF "not" ENot],
[binaryF "and" EAnd AssocLeft, binaryF "or" EAnd AssocLeft]
]
并以“讨厌”我的意思是,它告诉我,它期待一个整数或浮点数。
我们需要内部语句的内部,因为你可能有语法冲突。另外,你是什么意思“恨它”? – 2011-05-03 22:05:56