Parsing Haskell——解析器组合器关键字

Parsing Haskell——解析器组合器关键字,parsing,haskell,parser-combinators,Parsing,Haskell,Parser Combinators,我正在使用解析器组合器在Haskell中构建解析器。我在解析诸如“while”、“true”、“if”等关键字时遇到问题 因此,我面临的问题是,在关键字之后需要有分隔符或空格,例如在语句中 如果为cond,则为stat1,否则为stat2 fi;x=1 使用此语句时,所有关键字前面都有空格或分号。但是,在不同的情况下,可能会有不同的分离器 目前,我已按如下方式实施: keyword :: String -> Parser String keyword k = do kword <

我正在使用解析器组合器在Haskell中构建解析器。我在解析诸如“while”、“true”、“if”等关键字时遇到问题

因此,我面临的问题是,在关键字之后需要有分隔符或空格,例如在语句中
如果为cond,则为stat1,否则为stat2 fi;x=1
使用此语句时,所有关键字前面都有空格或分号。但是,在不同的情况下,可能会有不同的分离器

目前,我已按如下方式实施:

keyword :: String -> Parser String
keyword k = do
  kword <- leadingWS (string k)
  check (== ';') <|> check isSpace <|> check (== ',') <|> check (== ']')
  junk
  return word
关键字::字符串->解析器字符串
关键字k=do
kword Bool)to关键字,然后将其传递给check。但这不起作用,因为在解析关键字的地方,我们不知道允许使用哪种分隔符


我想知道我是否可以在这个问题上得到一些帮助?

不要试图处理
关键字中的分隔符,但您需要确保
关键字“if”不会与标识符“iffy”混淆(请参阅sepp2k的评论)

处理语句分隔符的方式如下:

statements = statement `sepBy` semi
statement  = ifStatement <|> assignmentStatement <|> ...
statements=statement`sebby`semi
语句=ifStatement assignmentStatement。。。

仅仅因为关键字后面有分号,并不意味着它被正确使用。关键词总是一些更大的句法结构的一部分。也就是说,关键字只是语法所基于的特定标记。关键字和标识符之间的唯一区别在于,语法可以识别关键字,而不是将其视为通用标记,留给后面的解析和计算阶段;您应该有另一个组合器来识别其他令牌的正确集合。(从这个意义上说,解析器实际上是在进行词法分析——将字节流转换为令牌流——以及解析——将令牌流转换为抽象语法树。)如果这样做,标识符“iffy”可以被解析为关键字“If”,后跟标识符“fy”。我相信(我承认我完全是在猜测)OP决定“在关键字之后必须有分隔符或空格”的原因是不允许这样做。哦,我明白了,也许我错过了问题中的这一点。如果我有什么要补充的,我会考虑一下并更新我的答案
statements = statement `sepBy` semi
statement  = ifStatement <|> assignmentStatement <|> ...