C/C++ parser/lexer 如何区分指针的“*”和乘法的“*”?
How C/C++ parser/lexer makes the difference between '*' of pointer and '*' of multiplication?
如何 C/C++ tokeniser/parser 不会误解 '*' 的用法,因为它可以用于乘法和指针类型。
例如:.
... {
...
obj *var1; // * used to make var1 as pointer to obj
var1 * var2; // * used to multiply var1 and var2
}
更新 1:虽然 tokenising/parsing,我们还不能区分引用变量的标识符和引用类型的标识符。
更新 2:(问题的上下文)我正在设计和实现 C/C++ 的编程语言系列,其中指针声明为 Pointer<int>
,我想改用 C 指针样式。
更新 3(2016 年 12 月 30 日):
这个 Whosebug question about LR(1) parser and C++ 的一些答案似乎解决了我的问题。
分词器不区分两者。它只是将其视为令牌 *
.
解析器知道如何查找名称。它知道 obj
是一种类型,因此可以以不同于 <non-type> * <non-type>
的方式解析 <type> * <identifier>
。您的直觉是正确的:在不实现任何语义的情况下不可能仅解析 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.
不太正确,因为它假定 tokenising/parsing 作为一个单独的步骤一次性完成。实际上,语法分析和语义分析是交织在一起的。当 typedef int obj;
被解析时,它被解释为意味着 obj
现在命名了一个类型。当解析继续并看到 obj * var1;
时,早期语义分析的结果可供使用。
如何 C/C++ tokeniser/parser 不会误解 '*' 的用法,因为它可以用于乘法和指针类型。 例如:.
... {
...
obj *var1; // * used to make var1 as pointer to obj
var1 * var2; // * used to multiply var1 and var2
}
更新 1:虽然 tokenising/parsing,我们还不能区分引用变量的标识符和引用类型的标识符。
更新 2:(问题的上下文)我正在设计和实现 C/C++ 的编程语言系列,其中指针声明为 Pointer<int>
,我想改用 C 指针样式。
更新 3(2016 年 12 月 30 日): 这个 Whosebug question about LR(1) parser and C++ 的一些答案似乎解决了我的问题。
分词器不区分两者。它只是将其视为令牌 *
.
解析器知道如何查找名称。它知道 obj
是一种类型,因此可以以不同于 <non-type> * <non-type>
的方式解析 <type> * <identifier>
。您的直觉是正确的:在不实现任何语义的情况下不可能仅解析 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.
不太正确,因为它假定 tokenising/parsing 作为一个单独的步骤一次性完成。实际上,语法分析和语义分析是交织在一起的。当 typedef int obj;
被解析时,它被解释为意味着 obj
现在命名了一个类型。当解析继续并看到 obj * var1;
时,早期语义分析的结果可供使用。