大多数 C/C++ 编译器如何为数组创建标记?

How do most of C/C++ compilers create tokens for arrays?

所以我想我有 2 个问题与大多数 c/c++ 编译器有关:

1。 当大多数 c/c++ 编译器的扫描器看到类似 MyArray[20] 的东西时,它创建的令牌是什么?大多数编译器会创建一个令牌,如 array_tokenarray_token[const_int] 或.. .? (我想知道将数组大小转换为令牌后会发生什么) 这个问题与我的第二个问题有点相关

2。 当我们在代码中间(而不是在声明中)写类似 MyArray[20.5] 的东西时,解析器是使用语法检测到这个错误,还是我们只能使用语义例程检测到这个错误?

重要说明:我说的是大多数 c/c++ 编译器和最通用的方式,我知道一些罕见的编译器可能会以不同的方式来做,但大多数编译器是如何工作的?什么是常态?或者至少最流行的编译器是如何工作的? (在我们的考试中,他们只是说它是一个 c/c++ 编译器,所以我们只需要假设它的行为与大多数编译器一样)

我对第二个问题的看法:

我认为解析器无法检测到这一点,因为我们可以在范围内有一个像 MyArray[I*j] 这样的表达式,因此我们的语法中有像 S--> array_token[expression] 这样的东西,并且因为表达式可以在其中浮动,所以解析器不会检测到错误 但如果我错了请纠正我。

  1. 根据ISO C标准中描述的词法规则,MyArray[20]是一个标识符,后面跟着一个[,后面跟着一个整数常量,后面跟着一个]。我希望大多数(甚至所有)C 编译器都能完全像那样表示它。标准或我所知道的任何实现中都没有定义数组标记之类的东西。

  2. 数组下标的语法规则是:

    postfix-expression:  postfix-expression [ expression ]
    

    MyArray[20.5] 匹配该规则,因此它在语法上是有效的。这是类型错误,不是语法错误。因此,检测该错误是语义分析器的工作。

  3. (回应您的评论)

    if we have something like INT array[10.5] it turns into this -------> int id[const_token] therefore the parser will detect this one correct? ( this time I'm talking about in the declaration ) since we can have a rule in the grammar like S--> id[int_const]

    C891数组声明符(声明中int之后的部分)的语法规则如下:

     direct-declarator: direct-declarator [ constant-expression<sub>opt</sub> ]</pre>

    array[10.5] 匹配该规则(因为 direct-declarator: identifier 是另一个规则),所以 int array[10.5] 是语法上有效的声明。同样,这是一个语义错误,而不是句法错误。

    PS:请注意,constant-expression 只是定义为 conditional-expression 的别名。表达式实际上应该是常量这一事实并不是由语法强制执行的,也是语义 属性.


1 我使用了 C89 的规则,因为它比后来的版本更简单。但是,更高版本在与问题相关的方式上没有区别。