z̫͋*_*z̫͋ 3 c grammar ambiguity lexical-analysis unary-operator
查看C语法,似乎输入++i可以有2个派生:要么被视为前缀增量运算符,要么被视为2个整数提升,就像+(+i)(同样适用--i).
我错过了什么?
unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
unary-operator: one of
& * + - ~ !
cast-expression:
unary-expression
( type-name ) cast-expression
Run Code Online (Sandbox Code Playgroud)
词法分析器使用最大munch原则,并且将尽可能多的字符形成有效的令牌以避免这些类型的歧义.
我们可以通过参考草案C99标准部分的6.4 词汇元素来证实这一点:
如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列.[...]
它提供了两个例子:
示例1程序片段1Ex被解析为预处理数字标记(一个不是有效的浮点或整数常量标记),即使解析为预处理标记1和Ex可能会生成有效表达式(例如,如果Ex是一个定义为+1的宏.类似地,程序片段1E1被解析为预处理数(一个是有效的浮动常量令牌),无论E是否是宏名.
和
示例2程序片段x +++++ y被解析为x ++ ++ + y,它违反了增量运算符的约束,即使解析x ++ + ++ y可能产生正确的表达式.