我正在使用whittle来解析语法,但我遇到了经典的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 解析器,它试图将 a 解析<name>
为 a<string>
并且一切都中断了。语法使事情变得复杂,因为它对不同的事物使用不同的字符串定界符,这就是我<string>
首先尝试制定规则的原因。
如果可能的话,是否有一种规范的方法来规范这个语法以使其符合 LALR 标准?