Questions tagged «compiler-construction»

标记“编译器构造”应应用于有关编译器编程的问题或有关编译器详细内部工作的问题。请勿使用有关*使用*特定编译器或编译错误的问题。

11
将GCC分别称为“ cc”和“ gcc”
我知道在大多数GNU / Linux系统上,可以从命令行通过名称“ cc”(而不是“ gcc”)调用GCC。一种方式与另一种方式调用时,GCC的行为是否有差异? 例如,我知道通过名称“ g ++”而不是“ gcc”调用GCC会导致GCC行为不同(它将.c文件视为C ++源代码,并在C ++标准库中链接)。“ gcc”与“ cc”之间在行为上是否有类似的区别? 编辑:到目前为止,关于GCC如果以一种方式调用还是以另一种方式调用,行为是否有所不同,到目前为止,没有一个答案给出明确的“是”或“否”。但是,提出深入研究源代码以检查其行为的想法使我沿着这条路走了。根据我在那里的发现,我现在认为答案是: 否。无论通过“ gcc”还是“ cc”调用,GCC的行为都相同。

3
如何使用ANTLR4创建AST?
我一直在搜索很多有关此信息,但找不到任何能真正帮助我构建AST的有用信息。我已经知道ANTLR4不会像以前的ANTLR3那样构建AST。每个人都说:“嘿,请使用访客!”,但是我找不到任何示例或有关如何执行此操作的详细说明... 我的语法必须像C,但是每个命令都用葡萄牙语(葡萄牙语编程语言)编写。我可以使用ANTLR4轻松生成解析树。我的问题是:创建AST现在需要做什么? 顺便说一句,我正在使用Java和IntelliJ ... EDIT1:我能得到的最接近的答案是该主题:是否有一个简单的示例使用antlr4从Java源代码创建AST并提取方法,变量和注释? 但是它只打印访问方法的名称。 由于第一次尝试对我不起作用,所以我尝试使用ANTLR3的本教程,但我不知道如何使用StringTamplate而不是ST ... 阅读《权威ANTLR 4参考》一书,我也找不到与AST相关的任何内容。 EDIT2:现在我有一个类来创建DOT文件,我只需要弄清楚如何正确使用访问者


11
为什么每次都要在C中指定数据类型?
从下面的代码片段中可以看到,我声明了一个char变量和一个int变量。编译代码时,它必须标识变量str和的数据类型i。 为什么在扫描变量时需要通过指定%sor%d来再次告知它是字符串还是整数变量scanf?声明变量时,编译器还不够成熟,无法识别吗? #include <stdio.h> int main () { char str [80]; int i; printf ("Enter your family name: "); scanf ("%s",str); printf ("Enter your age: "); scanf ("%d",&i); return 0; }

2
总和类型-为什么在Haskell中show(Int | Double)与`(show Int)|不同?(显示双)`
为什么这些不相等? show $ if someCondition then someInt else some double 和 if someCondition then show someInt else show someDouble 我了解,如果您将if ... else第一个示例中的部分本身与一个表达式隔离开,那么您就无法用匿名和类型来表示其类型Int | Double,就像您可以在TypeScript中轻松进行的操作(提及TypeScript,因为它是我经常使用的语言,该语言支持Sum类型),因此必须诉诸使用Either数据,然后再基于调用show。 我在这里给出的示例很简单,但对我来说,认为“好吧,我们将要显示某些东西,而某些东西取决于someCondition”,而不是“好吧,如果someCondition为true,则显示someInt,否则显示someDouble”,并且也允许减少代码重复(此处的显示重复了两次,但它也可能是一个长函数的应用程序,而不是if ... else可能要考虑的> 2个分支) 在我看来,对于编译器而言,检查构成求和类型的每种类型(在此处Int | Double)是否可以用作show函数的参数并确定类型是否正确应该很容易。更好的是,无论参数的类型如何,show函数总是会返回string,因此编译器不必随身携带所有可能的“分支”(因此所有可能的类型)。 是否选择不存在这样的功能?还是我认为实施起来更加困难?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.