c++ - 精神过程如何规则?

标签 c++ parsing boost-spirit boost-spirit-qi

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

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 或算法,没有模板或类。

编辑: 实际上我认为第二条规则应该在编译时失败,因为它不明确。

最佳答案

Spirit 是一个 PEG 解析器:

相关引用:

Syntactically, PEGs also look similar to context-free grammars (CFGs), but they have a different interpretation: the choice operator selects the first match in PEG, while it is ambiguous in CFG

所以,不,第二个例子一点也不含糊,它只是导致无限递归(--> stackoverflow)。

关于c++ - 精神过程如何规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18701019/

相关文章:

c++ - 将switch语句案例分组在一起?

c++ - C++ 中的 qsort 用于字符串数组?

arrays - 解码 map 和 array json

python - 解析站点中的表

c++ - 解析字符串的 Boost.Spirit 语义操作不起作用

c++ - boost Spirit 可以扫描语法树并产生结果吗?

c++ - 数据成员/代码指针偏移量

mysql - 使用mysql解析json

c++ - 用 boost::spirit 解析成一个 vector<vector<double>>

c++ - 在 C++ 中划分后的奇怪结果