2

此语法独立规则代码产生预期结果

term        = ( double_ >> "+" >> term ) [_val = _1 + _2]|
              ( double_ >> "-" >> term ) [_val = _1 - _2]|
              ( double_ >> "*" >> term ) [_val = _1 * _2]|
              ( double_ >> "/" >> term ) [_val = _1 / _2]|
              double_                    [_val = _1] ;

而这个没有:

term        = ( term >> "+" >> term ) [_val = _1 + _2]|
              ( term >> "-" >> term ) [_val = _1 - _2]|
              ( term >> "*" >> term ) [_val = _1 * _2]|
              ( term >> "/" >> term ) [_val = _1 / _2]|
              double_                    [_val = _1] ;

我想这与递归歧义有关......第二条规则在喂食时会尝试做什么: "1+2+3" ?

是否有一些很好的文档可以示意性地解释精神解析是如何执行的?我的意思是纯 c 或算法,没有模板或类。

编辑:实际上我认为第二条规则应该在编译器时失败,因为它是模棱两可的。

4

1 回答 1

2

Spirit 是一个 PEG 解析器:

相关报价:

在语法上,PEG 看起来也与上下文无关文法 (CFG) 相似,但它们有不同的解释:选择运算符选择 PEG 中的第一个匹配项,而在 CFG 中它是模棱两可的

所以,不,第二个例子一点也不模棱两可,它只会导致无限递归(--> stackoverflow)。

于 2013-09-09T15:13:24.787 回答