flex和bison递归问题

时间:2015-02-27 14:26:52

标签: parsing recursion bison flex-lexer

我是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”中定义的第一个整数“)因此留下了语法错误,因为他发现的下一件事与他无关。

有没有聪明的方法让野牛知道他实际上已达到最后的整数,他可以继续下一部分?优选地,不必在弯曲中定义新的令牌,这已经让一些令人不快的意外。

提前谢谢。

1 个答案:

答案 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 ; 需要具有由nestedDetailsPlusIntegernestedDetails组成的语义值;在与integer相关联的操作中,这两个部分可用于构造适当的对象。伪代码:

detail