我不太清楚還有其他問題。我認爲我需要這裏的一般指導。我有這樣的事情:複雜的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