所以我想我有 2 个与大多数 c/c++ 编译器相关的问题:
1.当大多数c/c++编译器的scanner看到MyArray[20]这样的东西时,它创建的token是什么?大多数编译器是否会创建像array_token或array_token[const_int]或...这样的标记?(我想知道将数组大小变成令牌后会发生什么变化)这个问题与我的第二个问题有关
2. 当我们在代码中间(不是在声明中)编写类似 MyArray[20.5] 的东西时,解析器是使用语法检测到这个错误还是我们只能使用语义例程检测到这个错误?
重要说明:我说的是大多数 c/c++ 编译器和最通用的方式,我知道一些罕见的编译器可能会以不同的方式执行,但大多数编译器如何操作?什么是常态?或者至少最流行的编译器是如何工作的?(在我们的考试中,他们只是说它的 ac/c++ 编译器,所以我们只需要假设它的行为就像大多数编译器一样)
我对第二个问题的看法:
我认为解析器无法检测到这一点,因为我们可以在 MyArray[I*j] 之类的范围内有一个表达式,因此我们的语法中有类似 S--> array_token[expression] 的东西,并且由于表达式中可以有浮点数,所以因此解析器不会检测到错误,但如果我错了,请纠正我。
根据 ISO C 标准中描述的词法规则,MyArray[20]
是一个标识符,后跟 a [
,后跟一个整数常量,后跟 a ]
。我希望大多数(甚至全部)C 编译器都能像那样表示它。没有标准中定义的数组令牌或我所知道的任何实现之类的东西。
数组下标的语法规则是:
postfix-expression: postfix-expression [ expression ]
MyArray[20.5]
匹配该规则,因此在语法上是有效的。这是类型错误,而不是语法错误。因此,语义分析器的工作是检测该错误。
(回应你的评论)
如果我们有像 INT array[10.5] 这样的东西,它会变成这个 -------> int id[const_token] 因此解析器会检测到这个正确吗?(这次我在声明中谈论)因为我们可以在语法中使用像 S--> id[int_const] 这样的规则
数组声明符的 C89 1语法规则(在声明之后的部分int
)如下:
direct-declarator: direct-declarator [ constant-expressionopt ]
array[10.5]
匹配该规则(因为direct-declarator: identifier
是另一条规则),因此int array[10.5]
语法上有效的声明也是如此。再说一次,这是一个语义错误,而不是一个句法错误。
PS:请注意,constant-expression
它只是简单地定义为conditional-expression
. 表达式实际上应该是常量这一事实不是由语法强制执行的,也是一种语义属性。
1我使用了 C89 中的规则,因为它比以后的版本更简单。但是,以后的版本在与问题相关的方式上没有区别。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句