我正在阅读解析器和解析器生成器,并在维基百科的LR解析页面中找到了这个语句:
可以使用LR解析器的一些变体来解析许多编程语言.一个值得注意的例外是C++.
为什么会这样?C++的哪个特定属性导致无法使用LR解析器进行解析?
使用谷歌,我只发现C可以用LR(1)完美解析,但C++需要LR(∞).
为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.
看起来clang过去有这个功能(-emit-asm),但它已经删除了.
今天有一个简单的方法吗?
我想知道是否只有一个符号表存储有关源文件的所有信息,还是有多个符号表相互堆叠,并且仅在当前作用域与该表相关时才获取。
例如说我有两种方法
int foo(int a){
int b;
bar(b);
...
}
double bar (int a){
int b;
...
}
Run Code Online (Sandbox Code Playgroud)
这里两个中的a和b的作用域不同,因此,如果符号表堆叠在一起,则在执行foo时会首先获取与foo相关的符号表。但是,在执行bar时,bar的符号表堆叠在foo的上面,因此当前符号表包含bar的a和b的信息。
如果符号表是集中式的,则foo的信息和bar的信息都驻留在一个符号表中,但是可能有一些条目指定foo中的a,b属于foo的范围,而bar中的a,b属于bar。没有其他符号表可参考
以上是我对符号表的假设。请告诉我哪一个是真实的案例,并在其中填入更多详细信息。
谢谢