【发布时间】:2021-01-23 05:12:29
【问题描述】:
在 C 和 C++ 语言中,编译器如何区分 * 用作指针 (MyClass* class) 和用作乘法运算符 (a * b) 或解除引用运算符 (*my_var )?
【问题讨论】:
-
取决于它的左右两边是什么?
-
维基百科有一篇关于经典方法的文章:lexer hack。
-
@user786653 至少在 gcc 不再存在的情况下。 C++ 足够复杂,以至于经典的词法分析器无能为力。 G++ 使用手写的递归下降解析器(类似于谷歌翻译器的基础)而不是基于野牛的解析器。但总的来说,它取决于编译器的实现,只有少数人公开了这个秘密
-
编译器区分
a & b和&var、+a和a + b或&&a和a && b的方式相同:一个是一元另一个是 binary 运算符。在 C++/CLI 中还有type ^vsa ^ b和type %vsa % b -
没有实际的歧义需要解决。从语法中可以清楚地看出是一元运算符还是二元运算符,并且从当前的解析上下文中总是可以清楚地看出是在编写声明还是取消引用。
标签: c++ c lexer lexical-analysis c++-faq