【发布时间】:2016-12-26 13:15:46
【问题描述】:
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++ 的一些答案似乎解决了我的问题。
【问题讨论】:
-
"
obj *var1;":将一个类型和一个未定义的标记相乘没有意义,所以它可能是一个变量定义。 -
通过知道什么是
obj/var1...但确实解析C++很复杂。 -
这就是我们有关键字和标识符的原因。
-
C++ 不是上下文无关可解析的。
-
@WaelBoutglay:为了简化语法,您可以添加关键字来声明变量,从而避免这些歧义。 (如
let <type> <var> = <expr>)。
标签: c++ c parsing tokenize lexer