如果我有以下陈述:
int 1xab; //statement 1
int 1 ; //statement 2
如果我去计算其中的令牌数量,那么根据我的说法,声明1中的令牌数不是4而声明2中的令牌数是3。
对于陈述1 :
对于陈述2 。
方法是否正确?
答案 0 :(得分:1)
除非您正在使用特定语言的规范,否则此处没有“正确”或“不正确”。在摘要中,任何一种答案都是可能的(和其他答案一样),不同语言中存在不同的可能性。
在Python和许多其他语言中,1xab
是两个令牌。使用最大munch规则匹配初始整数,然后将xab
解析为第二个标记。在大多数这些语言中,没有语法结构,其中标识符可以跟随令牌,因此无论如何都会触发语法错误,并且区别是学术性的。
在C和C ++中,整数文字可以用字母标记作为后缀。 (例如,1llu是无符号long long
整数文字。)C的设计者选择允许对此词法语法进行可能的扩展,因此任何以数字开头的字母数字字符串都被视为“pp-number” 。 [注1]
因此,如果要为现有语言实现处理器,则需要参考该语言的规范。如果您正在设计自己的语言,则可以选择更方便的令牌定义。
“Pp-numbers”还可以包含小数点(。)和指数( E + ),并且可以以小数点后跟数字开头。所以它比那复杂一点。最近的C ++版本还允许使用'作为分组符号,以便以可读的方式更容易地编写大整数。
为清楚起见,这里是预处理数字的C词法语法(C11标准的第6.4.8节):
pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number e sign
pp-number E sign
pp-number p sign
pp-number P sign
pp-number .
sign: one of
+ -
digit: one of
0 1 2 3 4 5 6 7 8 9
identifier-non-digit
是一个字母(只有Basic Latin子集中的字母,即 a 到 z 和 A 到 Z ), _ 下划线,unicode转义(“通用字符名称”),前提是它位于有效代码点列表中,或“其他实现定义的字符” ”