gpt4 book ai didi

c++ - C/C++ 解析器/词法分析器如何区分指针的 '*' 和乘法的 '*'?

转载 作者:行者123 更新时间:2023-11-28 05:21:53 25 4
gpt4 key购买 nike

C/C++ 标记器/解析器如何不误解“*”的用法,因为它可用于乘法和指针类型。例如:.

... {
...
obj *var1; // * used to make var1 as pointer to obj
var1 * var2; // * used to multiply var1 and var2
}

更新 1:在标记化/解析时,我们还无法区分引用变量的标识符和引用类型的标识符。

更新 2:(问题背景)我正在设计和实现 C/C++ 家族的编程语言,其中指针声明为 Pointer<int> ,我想改用 C 指针样式。

更新 3(2016 年 12 月 30 日):这个stackoverflow question about LR(1) parser and C++的一些答案似乎在对待我的问题。

最佳答案

tokeniser 不区分两者。它只是将其视为 token * .

解析器知道如何查找名称。它知道 obj是一个类型,所以可以解析 <type> * <identifier>不同于 <non-type> * <non-type> .您的直觉是正确的:在不实现任何语义的情况下不可能仅解析 C 的语法。正确解析 C 语法的唯一方法需要解释声明并跟踪哪些名称是类型,哪些名称是非类型。您的更新:

While tokenising/parsing, we can't yet make difference between identifier that refers to a variable and identifier that refers to a type.

不太正确,因为它假设标记化/解析是作为一个单独的步骤同时完成的。实际上,语法分析和语义分析是交织在一起的。当typedef int obj;被解析,它被解释并理解为 obj现在命名一个类型。当解析继续并且 obj * var1;可见,前面语义分析的结果是可以使用的。

关于c++ - C/C++ 解析器/词法分析器如何区分指针的 '*' 和乘法的 '*'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41331871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com