C++ C++;解析表达式,分解求值顺序

C++ C++;解析表达式,分解求值顺序,c++,C++,我正在尝试编写一个表达式解析器。我一直坚持的一个部分是通过适当的优先顺序将表达式分解成块 我找到C++操作符的优先顺序。但是基于此,我应该在哪里拆分表达式呢 我必须假设用户最坏的情况。下面是一个过于夸张的测试示例: if (test(s[4]) < 4 && b + 3 < r && a!=b && ((c | e) == (g | e)) || r % 7 < 4 * givemeanobj(a & c &

我正在尝试编写一个表达式解析器。我一直坚持的一个部分是通过适当的优先顺序将表达式分解成块

我找到C++操作符的优先顺序。但是基于此,我应该在哪里拆分表达式呢

我必须假设用户最坏的情况。下面是一个过于夸张的测试示例:

if (test(s[4]) < 4 && b + 3 < r && a!=b && ((c | e) == (g | e)) ||
   r % 7 < 4 * givemeanobj(a & c & e, b, hello(c)).method())
if(测试[4])<4和&b+3
也许它甚至没有评估,如果没有,我仍然需要分解它来确定

它应该分解为由操作符连接的单块和对块。本质上,它分解为一个树结构,其中分支是分组,每个节点有两个分支

按照优先顺序,首先要做的是计算
givemeanobj()
,不过这很容易看到。下一个是乘法符号。这是将
*
之前的所有内容拆分为单独的,还是仅拆分为
4
<代码>4*givemeanobj
位于

有没有一个简单的规则可以遵循

可以,使用解析器生成器,例如。您正式编写语言规范,它将生成解析所有有效表达式(而不是无效表达式)的代码。ANTLR很好,因为它可以为您提供一个可以轻松遍历和评估的模型


或者,如果你正在解析的语言实际上是C++,那么使用C++,它是一个合适的编译器,也可以作为一个库使用。许多人认为:“首先要做的是评估

givemeanobj()
,但这很容易看到”是吗?您需要首先评估
测试(s[4])
,因为必须在rhs之前评估
&&
的lhs。您还需要考虑(1)运算符的关联性(2)逻辑运算符(
&&&
|
)在函数调用中进行短路(3)——逗号不是逗号运算符(4)某些数字运算符(例如,
%
)和位运算符(
&
|
)仅适用于整数类型。[我假设您的“测试示例”中没有一个变量是具有重载运算符的类的实例]。A可能就是您要查找的。复杂表达式的“分析”(剖析)由递归处理。此外,正如您正在链接的页面上所述,“优先级和关联性是编译时概念,独立于,这是一个运行时概念。”