Helllo, 我有以下语法:
<attribute_value> ::= <spec_constant> | <symbol> | ( <s_expr>*)
<attribute> ::= <keyword> | <keyword> <attribute_value>
通过阅读tutorial,它表示可以使用buildExpressionParser
并执行左因素分析,但没有示例。
有人能举例说明我应该如何使用Parsec解析上述语法,或者只是指向正确的方向?
感谢您提供任何帮助。
答案 0 :(得分:1)
假设您已经拥有
data Keyword
data AttributeValue
data Attribute = KeywordOnly Keyword
| KeywordWithAttribute Keyword AttributeValue
keyword :: Parser Keyword
attributeValue :: Parser AttributeValue
然后您可以通过首先解析attribute :: Parser Attribute
,然后选择解析Keyword
,然后将它们组合来实现attribute
:
attribute :: Parser Attribute
attribute = pack <$> keyword <*> optionMaybe attributeValue
where
pack :: Keyword -> Maybe AttributeValue -> Attribute
pack kw = maybe (KeywordOnly kw) (KeywordWithAttribute kw)
无需改变语法结构。