我正在使用解析器组合器在Haskell中构建解析器。我在解析“while”,“true”,“if”等
等关键字时遇到问题所以我面临的问题是在关键字之后需要有一个分隔符或空格,例如在语句中
if cond then stat1 else stat2 fi;x = 1
使用此语句,所有关键字都有一个前面的空格或半冒号。但是在不同情况下可能会有不同的分隔符。
目前我已按如下方式实施:
keyword :: String -> Parser String
keyword k = do
kword <- leadingWS (string k)
check (== ';') <|> check isSpace <|> check (== ',') <|> check (== ']')
junk
return word
但是这个关键字解析器的问题在于它允许具有if语句的程序; cond然后stat1 else stat2 fi
我们尝试将(Char - &gt; Bool)传递给关键字,然后将其传递给检查。但这不起作用,因为在我们解析关键字时,我们不知道允许哪种分隔符。
我想知道我是否能对这个问题有所帮助?
答案 0 :(得分:3)
请勿尝试处理keyword
中的分隔符,但您需要确保keyword "if"
不会与标识符“iffy”混淆(请参阅sepp2k的评论)。
keyword :: String -> Parser String
keyword k = leadingWS $ try (do string k
notFollowedBy alphanum)
处理语句的分隔符将如下所示:
statements = statement `sepBy` semi
statement = ifStatement <|> assignmentStatement <|> ...