compiler-theory相关内容

解析树和抽象语法树 (AST) 有什么区别?

它们是由编译过程的不同阶段生成的吗?还是它们只是同一事物的不同名称? 解决方案 这是基于Expression Evaluator Terrence Parr 的语法. 本例的语法: 语法 Expr002;选项{输出=AST;ASTLabelType=CommonTree;//$stat.tree ref 的类型等...}编:(统计)+;stat : expr NEWLINE ->表 ..

解析器、解释器和编译器的学习资源

一段时间以来,我一直想尝试编写自己的语言(表面上是为了学习经验),因此需要在解析器、解释器和编译器的构建方面相对扎实.所以: 有没有人知道关于构建解析器、解释器和编译器的任何好的资源? 编辑:我不是在寻找编译器编译器/解析器编译器,例如 Lex、Yacc 和 Bison... 解决方案 我读过的关于编译器的最好的论文是日期 1964Val Schorre 的“META II 一 ..

Lambda 表达式如何在 Java 字节码中翻译

我正在尝试在 java 中使用 lambda 表达式创建一个示例,并且我使用的是官方 JDK8.我的示例运行成功.但是当我试图检查编译器如何将 lambda 表达式转换为字节码时,这让我有些困惑.以下是我的示例代码:- 公共类 LambdaTest {公共整数 lambdaBinaryOperator(BinaryOperator binaryOperator) {返回 binaryOperat ..
发布时间:2022-01-16 12:09:15 Java开发

在 Java 字节码中如何翻译 Lambda 表达式

我正在尝试使用 Java 中的 lambda 表达式创建一个示例,并且我正在使用官方的 JDK8.我的例子运行成功.但是当我试图检查编译器如何将 lambda 表达式转换为字节码时,这让我有些困惑.以下是我的示例代码:- 公共类 LambdaTest {公共整数 lambdaBinaryOperator(BinaryOperator binaryOperator) {返回 binaryOpera ..
发布时间:2021-12-23 22:29:44 Java开发

关于解析器、解释器和编译器的学习资源

一段时间以来,我一直想尝试编写自己的语言(表面上是为了学习经验),因此需要相对扎根于解析器、解释器和编译器的构建.所以: 有人知道有关构建解析器、解释器和编译器的任何好的资源吗? 编辑:我不是在寻找诸如 Lex、Yacc 和 Bison 之类的编译器编译器/解析器编译器... 解决方案 我读过的最好的关于编译器的论文是 1964 年“META II 一种面向语法的编译器编写语言 ..

斯卡拉“<-"为了理解

我发现 Scala 总是对任何事情都有“自然的解释".总是类似于“哦,但这只是在这个和那个对象上调用一个带有这个和那个参数的函数".从某种意义上说,没有什么是真正的编译器魔法,正如我们在其他语言中所知道的那样. 我的问题是关于以下代码中使用的 println(i)) ..
发布时间:2021-12-07 12:55:23 其他开发

解析树和抽象语法树 (AST) 之间有什么区别?

它们是由编译过程的不同阶段生成的吗?或者它们只是同一事物的不同名称? 解决方案 这是基于 Expression Evaluator 语法 by Terrence Parr. 这个例子的语法: 语法 Expr002;选项{输出=AST;ASTLabelType=普通树;//$stat.tree ref 的类型等...}编:(统计)+;统计:expr NEWLINE ->表达式|ID ..

去除 ANTLR 中的左递归

如删除左递归中所述,有两种方法可以删除左递归. 修改原始语法以使用某些程序删除左递归 写文法本来就没有左递归 人们通常使用什么来删除(没有)ANTLR 的左递归?我已经将 flex/bison 用于解析器,但我需要使用 ANTLR.我唯一关心的是使用 ANTLR(或一般的 LL 解析器)是去除左递归. 实际上,在 ANTLR 中删除左递归有多严重?这是使用 ANTLR 的阻碍吗 ..
发布时间:2021-11-11 03:39:57 其他开发

解析树和抽象语法树 (AST) 之间有什么区别?

它们是由编译过程的不同阶段生成的吗?或者它们只是同一事物的不同名称? 解决方案 这是基于 Expression Evaluator 语法 by Terrence Parr. 这个例子的语法: 语法 Expr002;选项{输出=AST;ASTLabelType=普通树;//$stat.tree ref 的类型等...}编:(统计)+;统计:expr NEWLINE ->表达式|ID ..

“小于/大于"的性能优于“小于/大于或等于"

将小于/大于与小于/大于或等于进行比较是否在计算上更高效? 直觉上,人们可能会认为小于/大于稍微好一点. 编译器是否可以使用一些技巧使比较看起来相同? 编译器可以消除例如小于或等于 和 小于 通过将边界增加 1 但如果边界是“活动的",则无法执行此操作. 解决方案 几乎在每个现代 CPU 上,都有 compare/jumpless 和 compare/jumplesseq ..
发布时间:2021-09-07 18:31:05 其他开发

是否有任何语言名称可以包含空格字符?

是否有任何编程语言允许名称包含空格?(按名称,我指的是变量、方法、字段等) 解决方案 Scala 确实允许在标识符名称中使用空格字符(但要做到这一点,您需要用一对反引号将标识符括起来). 示例(在 Scala REPL 中执行): 欢迎使用 Scala 版本 2.8.0.final(Java HotSpot(TM) 客户端 VM,Java 1.6.0_22).输入表达式以对它们进行 ..
发布时间:2021-06-21 20:25:37 其他开发

装配性能调优

我正在编写一个编译器(乐趣无穷),但我想尝试使其尽可能高效.例如,有人告诉我,在英特尔架构上,使用 EAX 以外的任何寄存器来执行数学运算都会产生成本(大概是因为它可以交换成 EAX 来执行实际操作数学).至少有一个消息来源指出了这种可能性(http://www.swansontec.com/sregisters.html). 我想验证和衡量这些性能特征上的差异.因此,我用C ++编写了该程 ..
发布时间:2021-04-23 20:00:56 C/C++开发

哪些编程语言是无上下文的?

或者,更准确地说:哪种编程语言是由上下文无关的语法定义的? 根据我的收集,C ++并非上下文无关的诸如宏和模板之类的东西。我的直觉告诉我,功能语言可能是上下文无关的,但是我没有任何硬数据可以支持。 简洁的示例的额外代表:-) 解决方案 语法上正确的程序集对几乎所有语言都是上下文无关的。 几乎所有语言的编译程序集都不是上下文无关的。例如,如果所有编译的C程序的集合都是上下文 ..
发布时间:2020-10-08 23:17:49 其他开发

如果不使用经典方法并将其转换为LL(1),则查找语法不是LL(1)

假设我有这样的语法: S-> A C x | u B A A-> z A y | u ε B-> x y B u C-> B w B | w A 此语法显然不是LL(1),我可以找到它来构造解析表。但是,如果不使用经典方法,即不构造解析表或发现任何冲突,有什么方法可以证明该语法不是LL(1)? 我该如何将该语法转换为LL(1)?我认为我必须同时使用e ..

在ANTLR中删除左递归

如删除左递归中所述,有两种方法可以删除左递归./p> 使用某些过程修改原始语法以消除左递归 写本来没有左递归的语法 人们通常使用ANTLR去除(不具有)左递归的方式?我已经将flex/bison用于解析器,但是我需要使用ANTLR.我唯一关心的是使用ANTLR(或一般情况下的LL解析器)是左递归删除. 从实际意义上讲,在ANTLR中消除左递归的严重性如何?这是使用ANTLR的热门节 ..
发布时间:2020-09-02 22:52:06 其他开发

现代和旧的编译器是用什么编写的?

作为编译器,而不是解释器,只需要翻译输入而不运行它,其自身的性能就不会像解释器那样有问题. 因此,您不会用Ruby或PHP编写解释器,因为它太慢了. 但是,编译器呢? 如果您要使用脚本语言编写编译器,甚至可能具有快速开发的功能,就可以将源代码和初始开发时间减少一半,至少我认为是这样. 可以肯定的是:对于脚本语言,我的意思是解释语言具有典型的特征,这些特征通常至少会使程序员更快,更 ..

从正则表达式创建NFA的步骤

从正则表达式创建NFA时遇到“描述每个步骤"的问题.问题如下: 将以下正则表达式转换为不确定的有限状态自动机(NFA),清楚地描述了所使用算法的步骤: (b | a)* b(a | b) 我已经制作了一个简单的三态机,但是这很直觉. 这是我的讲师在过去的一次考试中提出的问题,他的讲师也对汤普森的算法作了以下解释:任何人都可以弄清楚如何“清楚地描述每个步骤"吗?似乎只是一组基本规则,而不 ..
发布时间:2020-07-01 18:35:00 其他开发

寄存器分配和溢出,简单的方法?

我正在寻找一种将局部变量分配给寄存器的方法.我知道有几种严肃的方法可以做到这一点(即在Wikipedia上提到的 ) ,但我对如何完成“起毛"感到困惑.而且,相关文献令人生畏.我希望有一些更简单的方法可以满足我的要求: 正确性-一种算法,无论有多少局部变量,该算法都会生成正确的代码. 简单性-无需阅读过多文献就可以理解的东西. 效率-它需要比当前方法更好,即: 将操作x = y # ..

带有epsilon生产的LR(1)解析表

我在使用包含epsilon生产的语法为LR(1)解析器构建项目集时遇到麻烦.例如,给定以下语法(其中eps代表epsilon) S -> a S U U -> b | eps State0为 S' -> .S, $ S -> .a S U, $ 从State0中移动"a"会得到以下状态,我们称其为State2 S -> a .S U, $ S -> .a S U, ..
发布时间:2020-05-25 01:15:10 其他开发

LR1解析器和Epsilon

我试图了解LR1解析器的工作原理,但是我想到了一个奇怪的问题:如果语法中包含Epsilons,该怎么办?例如:如果我有语法: S -> A A -> a A | B B -> a 很清楚如何开始: S -> .A A -> .a A A -> .B ...等等 但是我不知道怎么做这样的语法: S -> A A -> a A a | \epsilon 这样做正确 ..
发布时间:2020-05-25 00:36:51 其他开发