【问题标题】:How do most of C/C++ compilers create tokens for arrays?大多数 C/C++ 编译器如何为数组创建标记?
【发布时间】:2018-10-02 03:14:15
【问题描述】:

所以我想我有 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] 的东西,因为表达式可以有 float在其中,因此解析器不会检测到错误 但如果我错了,请纠正我。

【问题讨论】:

    标签: compiler-errors compiler-construction compiler-warnings


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

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

      postfix-expression:  postfix-expression [ expression ]
      

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

    3. (回应您的评论)

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

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

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

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

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


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

    【讨论】:

    • 感谢您的回答!最后一个问题:所以如果我们有类似 INT array[10.5] 的东西,它会变成这样: int id[const_token] 因此解析器会检测到这个正确吗? (这次我在声明中讨论)因为我们可以在语法中拥有一个规则,例如 S--> id[int_const]
    • Sepp2k 是对的。请参阅stackoverflow.com/a/36681568/120163 了解我们 C 前端的代表性词法分析器输出。您可以将标识符视为单个标记。此处未显示:'[' 和 ']' 也是标记;由于 ';' 的标记,应该很明显。
    • @OneAndOnly 我已在我的回答中添加了对您的评论的回答。
    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 2011-05-19
    • 2012-01-31
    • 1970-01-01
    • 2016-01-10
    • 2011-01-29
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多