C中表达式的解析规则是什么?

时间:2010-10-23 16:56:09

标签: c parsing expression

我如何理解像

这样的表达式的解析
a = b+++++b---c--;

在C?

我刚刚编写了上面的表达式,是的,我可以使用任何编译器检查结果,但我想知道的是基本规则我应该知道理解这样的解析C中的表达式。

3 个答案:

答案 0 :(得分:5)

从标准6.2(4):

  

如果输入流已被解析为预处理令牌,直到给定的字符,那么   下一个预处理令牌是可构成一个的最长字符序列   预处理令牌。

他们甚至添加了例子:

  

示例2程序片段x +++++   被解析为x ++ ++ + y,其中   违反增量约束   运算符,即使解析x ++   + ++ y可能会产生正确的表达式。

所以你的陈述:

a = b+++++b---c--; 

相当于:

a = b ++ ++ + b -- - c -- ;

答案 1 :(得分:2)

所涉及的运营商包括++--+-。一些parantheses和space会在这里有所帮助:

a = ((b++)++) + (b--) - (c--);

我不知道解析是如何工作的,但是没有涉及歧义(好的,有,请看Dingo的答案),所以我想这可以通过一些简单的规则来完成,例如: / p>

  • 一个或多个字符构成变量名称,最简单的“表达式”
  • 运营商+-合并了两个“表达式”
  • 操作员++--是“表达式”的后缀

要消除歧义,您可以为++--提供比+-更高的优先级。

答案 2 :(得分:1)

我知道你对解析器有多了解,所以以防万一: http://en.wikipedia.org/wiki/LL_parser

如果您需要正式的语法描述,请查看解析器生成器的描述:https://javacc.dev.java.net/servlets/ProjectDocumentList?folderID=110