我使用whittle解析语法,但我遇到了经典的LALR ambiguity problem。我的语法看起来像这样(简化):用LALR解析器解决我语法中的歧义问题
<comment> ::= '{' <string> '}' # string enclosed in braces
<tag> ::= '[' <name> <quoted-string> ']' # [tagname "tag value"]
<name> ::= /[A-Za-z_]+/ # subset of all printable chars
<quoted-string> ::= '"' <string> '"' # string enclosed in quotes
<string> ::= /[:print:]/ # regex for all printable chars
的问题,当然,是<string>
。它包含所有可打印的字符,因此非常贪婪。由于它是一个LALR解析器,因此它试图将<name>
解析为<string>
,并且所有内容都会中断。语法使事情变得复杂,因为它为不同的事物使用了不同的字符串分隔符,这就是为什么我试图制定<string>
规则的原因。
是否有规范化的方法来规范这个语法,使其符合LALR,如果它甚至可能?
您能否为每个分隔符类型制定不同的''规则,然后让该规则匹配“除了换行符或分隔符之外的任何内容?” –
templatetypedef
@templatetypedef:嗯,不,它仍然尝试应用字符串规则而不是'': 'Whittle :: ParseError:解析错误:预计:名称,但在第1行得到:comment_string .' –
tobiasvl