1
スラッシュの間の単純な式を解析しようとしています。例:/ 1+2*3 /
は、7
と評価する必要があります。しかしParsec:スラッシュ間の式の解析
*Test> parse programInBraces "" "{ 1+2*3/4 }"
Right 2
、programInSlashes
失敗しない:
私は、これはprogramInBraces
大丈夫働く
module Test where
import Text.Parsec
import Text.Parsec.Language (emptyDef)
import Text.Parsec.Combinator (between)
import Text.Parsec.String (Parser)
import qualified Text.Parsec.Expr as Ex
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 Int
integer = fromIntegral <$> Tok.integer lexer
parens :: Parser a -> Parser a
parens = Tok.parens lexer
braces :: Parser a -> Parser a
braces = Tok.braces lexer
slashes :: Parser a -> Parser a
slashes = between (reserved "/") (reserved "/")
reserved :: String -> Parser()
reserved = Tok.reserved lexer
reservedOp :: String -> Parser()
reservedOp = Tok.reservedOp lexer
binary s f assoc = Ex.Infix (reservedOp s >> return f) assoc
table = [[binary "*" (*) Ex.AssocLeft,
binary "/" div Ex.AssocLeft]
,[binary "+" (+) Ex.AssocLeft,
binary "-" (-) Ex.AssocLeft]]
factor :: Parser Int
factor = try integer
<|> parens expr
expr :: Parser Int
expr = Ex.buildExpressionParser table factor
programInSlashes :: Parser Int
programInSlashes = slashes expr
programInBraces :: Parser Int
programInBraces = braces expr
をしようとしていた
が*Test> parse programInSlashes "" "/ 1+2*3/4 /"
Left (line 1, column 12):
unexpected end of input
expecting end of "/", integer or "("
明らかに問題が/
が両方あるということです演算子とプログラム自体の区切り文字です。しかし、言語があいまいではないので、それを解析できるはずはありませんか?
申し訳ありませんが、今すぐ試してみてください。私は残念なことに、残念なことに、 'parse programInSlashes" "/ 1 + 2 * 3/4 /"と言っています。 左(行1、列10): 予期しない '4' "/" ' –