我使用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