parsing - Haskell——解析器组合器关键字

标签 parsing haskell parser-combinators

我正在使用解析器组合器在 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/

相关文章:

scala 组合器解析器保留原始输入

python - 在 Python 中,如何解析 3 个字节的第 11 位和第 12 位?

比较两个没有 CR LF 的字符数组

haskell - 如何编写一个不占用空间的解析器?

haskell - 从外部网络采样行为

haskell - 反射FRP : How to set button text from textInput on button click

parsing - 深度扩展解析器库的方法

iOS - NSInternalInconsistencyException 'circular dependency when saving'

c++ - Boost::DateTime 无法正确解析

r - 将数据帧转换为带有计数的矩阵