我是flex和bison的新手,我正在尝试使用flex和bison解析一个文件,但是有一个问题可能有人可以帮我解决,它看起来有点像这样:< / p>
details : empty | details detail ;
detail:
TOKEN
string
string
nestedDetails
integer ;
由此:
nestedDetails : empty
|
string
integer
integerPairs ;
和
integerPairs : integer integer | integerPairs integer integer ;
我的问题是:
解析文件时,bison会经历“nestedDetails”并且永远不会到达最后的整数调用(大概是,当他找到最后一个整数时,他正在寻找另一个整数,因为他认为它是“nestedDetails”中定义的第一个整数“)因此留下了语法错误,因为他发现的下一件事与他无关。
有没有聪明的方法让野牛知道他实际上已达到最后的整数,他可以继续下一部分?优选地,不必在弯曲中定义新的令牌,这已经让一些令人不快的意外。
提前谢谢。
答案 0 :(得分:1)
有一个简单的解决方案,但它稍微改变了解析树。 (但它很容易恢复。见下文。)
nestedDetails
必须始终跟integer
后面,但正如问题所示,目前尚不清楚integer
是否应该移位或触发减少,直到{{{}后面的令牌遇到1}}。所以简单的解决方案是推迟决定:
integer
要恢复原始解析树,details : %empty | details detail ;
detail : TOKEN string string nestedDetailsPlusInteger ;
nestedDetailsPlusInteger
: integer
| string integer integerPairs integer ;
integerPairs
: integer integer
| integerPairs integer integer ;
需要具有由nestedDetailsPlusInteger
加nestedDetails
组成的语义值;在与integer
相关联的操作中,这两个部分可用于构造适当的对象。伪代码:
detail