我正在使用解析器组合器在 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 -> Bool) to 关键字,然后将其传递给检查。但这是行不通的,因为我们在解析关键字时不知道允许使用哪种分隔符。
我想知道是否可以帮助解决这个问题?
最佳答案
不要尝试处理关键字
中的分隔符,但您需要确保关键字“if”
不会与标识符“iffy”混淆(请参阅注释由 sepp2k 提供)。
keyword :: String -> Parser String
keyword k = leadingWS $ try (do string k
notFollowedBy alphanum)
处理语句的分隔符如下所示:
statements = statement `sepBy` semi
statement = ifStatement <|> assignmentStatement <|> ...
关于parsing - Haskell——解析器组合器关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39397815/