Compiler errors 大多数C/C++;编译器是否为数组创建令牌?

Compiler errors 大多数C/C++;编译器是否为数组创建令牌?,compiler-errors,compiler-construction,compiler-warnings,Compiler Errors,Compiler Construction,Compiler Warnings,因此,我想我有两个问题与大多数c/c++编译器有关: 一,。 当大多数c/c++编译器的扫描程序看到类似MyArray[20]的东西时,它创建的令牌是什么?大多数编译器是否创建类似于array_token或array_token[const_int]或。。。?(我想知道将数组大小转换为令牌后会发生什么变化) 这个问题和我的第二个问题有点关联 二,。 当我们在代码的中间(不在声明中)写类似MyRoad(20.5)的东西时,语法分析器使用语法来检测这个错误吗?或者我们只能使用语义例程来检测这个错误?

因此,我想我有两个问题与大多数c/c++编译器有关:

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

二,。 当我们在代码的中间(不在声明中)写类似MyRoad(20.5)的东西时,语法分析器使用语法来检测这个错误吗?或者我们只能使用语义例程来检测这个错误? 重要提示:我谈论的是大多数c/c++编译器和最普遍的方式,我知道一些罕见的编译器可能会有不同的做法,但大多数编译器是如何工作的?什么是标准?或者至少最流行的编译器是如何工作的?(在我们的考试中,他们只是说它是一个c/c++编译器,所以我们只能假设它的行为与大多数编译器一样)

我对第二个问题的看法:

我认为解析器无法检测到这一点,因为我们可以在作用域中有一个表达式,比如MyArray[I*j],因此我们的语法中有一些类似于S-->array_token[expression],因为表达式中可以有float,所以解析器不会检测到错误 但如果我错了,请纠正我

  • 根据ISO C标准中描述的词汇规则,
    MyArray[20]
    是一个标识符,后跟一个
    [
    ,后跟一个整数常量,后跟一个
    ]
    。我希望大多数(甚至所有)C编译器都能像这样表示它。据我所知,标准或任何实现中都没有定义数组令牌

  • 数组下标的语法规则为:

    postfix-expression:  postfix-expression [ expression ]
    
    MyArray[20.5]
    与该规则匹配,因此在语法上是有效的。这是一个类型错误,不是语法错误。因此,语义分析器的工作就是检测错误

  • (回应你的评论)

    如果我们有类似于INT-array[10.5]的东西,它会变成------->INT-id[const_-token],因此解析器会检测到这个,对吗?(这次我在声明中谈到)因为我们可以在语法中有一个规则,比如S-->id[int_const]

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

    directdeclarator:directdeclarator[constant expressionopt]

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

    注意,
    常量表达式
    仅定义为条件表达式的别名。表达式实际上应该是常量这一事实并不是语法强制的,它也是一种语义属性



  • 1我使用了C89中的规则,因为它比以后的版本更简单。但是,更高版本的版本在与问题相关的方面没有差异。

    谢谢您的回答!最后一个问题:如果我们有类似INT-array[10.5]的东西,它会变成:INT-id[const_-token],因此解析器会检测到这个,对吗?(这次我在声明中谈到)因为我们可以在语法中有一个规则,比如S-->id[int_const]Sepp2k就是正确的规则。有关我们的C前端的代表性lexer输出,请参阅。您可以将标识符视为单个标记。此处未显示:“[”和“]”也是标记;应该是明显的,因为“;”的标记@我在我的回答中添加了对你评论的回答。
     direct-declarator: direct-declarator [ constant-expressionopt ]