7得票2回答
编译器单元测试

怎样才能最好地对一个复杂的单元(如编译器)进行单元测试? 我在过去几年中写了几个编译器和解释器,我发现这种代码很难以一种好的方式进行测试。 如果我们考虑抽象语法树生成这样的东西。你会如何使用TDD测试它? 小构建可能容易测试。 例如:类似以下内容: string code = @"pu...

31得票4回答
LL(0)解析器是否存在?

我在某个地方看到一个问题,询问LL(0)和LR(0)解析器之间的区别。是否存在LL(0)解析器?如果有,它们如何在不查看任何标记的情况下进行解析? 我在某处看到有人提出了关于LL(0)和LR(0)解析器差异的问题。是否存在LL(0)解析器?如果存在,它们是如何在不查看任何标记的情况下进行...

10得票6回答
如何设计一个快速的编译器?关键的设计选择是什么?

我想知道如何设计一个编译器,使其编译速度非常非常快。 首先,让我澄清一些问题: 我不是在谈论编译器生成的代码的速度。已经有很多资源可供学习如何优化生成的代码。我找不到的是使编译器本身变快的信息。 我也不感兴趣讨论为什么C++编译器通常比Java编译器慢(例如)。我感兴趣的是可以用什么技术...

7得票1回答
将不应存在的节点放入解析树中

我正在编写一种语言的解析器,扫描器被设计成根据一个布尔标记来 返回不必要的终端(例如空格)或者 不返回。 现在,在解析器中,我不想用所有这些终端来混淆语法,它们应该以某种方式被解析树“自动地”吞噬掉。 为了做到这一点,“神奇”的方法是,我想把终端链接起来(简单的环形链表),这样我就可...

13得票5回答
ANTLR中消除左递归

正如在 Removing left recursion 中所解释的那样,有两种方法可以消除左递归。 使用某些过程修改原始语法以消除左递归 最初编写语法时不要有左递归 人们通常用什么来消除(没有)ANTLR中的左递归?我已经使用了flex / bison进行解析器,但我需要使用ANTLR...

8得票1回答
实现常见子表达式消除

我正在研究实现公共子表达式消除(CSE),以处理对应于大型数学表达式的表达式图(数百万个节点)。 哪些算法适用于执行此操作?我在互联网上搜索了易于实现的算法,但未找到任何内容。如果可能,该算法应具有与完整表达式图中节点数量成线性关系的复杂度。

8得票4回答
编译与翻译的区别,“编译”Java为字节码?

我的理解如下,定义如下: 翻译 - 使用某种语言编写代码,生成其他语言的代码。 编译 - 翻译成机器码。 机器码 - 直接给CPU的指令。 现在,来自docs.oracle.com: javac - Java编程语言的编译器 编译器...?我认为它应该是Java 翻译器,因为它...

21得票1回答
Lambda表达式如何转换为Java字节码

我正在尝试在Java中使用lambda表达式创建一个示例,并且我正在使用官方的JDK8。我的示例已经成功运行。但是当我尝试检查编译器如何将lambda表达式转换为字节码时,这让我感到有些困惑。以下是我的示例代码:public class LambdaTest { public Inte...

9得票7回答
为什么编译器不能像我输入代码一样立即编译它?

为什么编译器不能在我输入代码时直接编译它呢? 从用户的角度来看,它可以像语法着色一样顺畅工作。如果您停止输入足够长的时间(可能是几秒钟),则编译(而不是链接)将完成,并且使用类似语法着色的方式来识别代码错误。 这并不像我的3GHz四核怪兽电脑真的很忙于做其他事情。为什么不让它一直编译呢?

27得票3回答
从正则表达式创建NFA的步骤

当我从正则表达式创建NFA时,我在“描述每个步骤”方面遇到了问题。问题如下: 将以下正则表达式转换为非确定有限状态自动机(NFA),清楚地描述您使用的算法的步骤: (b|a)*b(a|b) 我已经制作了一个简单的三状态机,但这很大程度上是基于直觉。 这是我的讲师过去考试的问题,他还写了有关...