问题标签 [tiger]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1068 浏览

compiler-construction - Tiger-compiler 的目标架构

我正在用 F# 编写一个Tiger编译器,我终于到了不能再推迟对目标体系结构的决定的​​地步。

这是我的第一个编译器,但绝对不会是我的最后一个。那么......对于第一个编译器来说,一个好的目标架构是什么?

我曾考虑过以 CIL (.NET) 为目标,但书中的中间代码 似乎更适合注册机。

我也想知道当我完成这个编译器后我应该去哪里。我应该尝试针对其他架构吗?我应该关注编译器的另一部分吗?为什么?

0 投票
1 回答
1758 浏览

ocaml - 使用 Ocamllex 对字符串进行词法分析(Tiger 编译器)

我正在尝试遵循 Appel 的“ML 中的现代编译器实现”,并正在使用 Ocamllex 编写词法分析器。

规范要求词法分析器在翻译转义序列后返回字符串。以下代码摘自 ocamllex 输入文件:

有没有更好的办法?

0 投票
2 回答
153 浏览

compiler-construction - 我的个人 Tiger 编译器需要一个可配置的 IDE?

我做了一个 Tiger 编译器,所以我需要一个简单的 IDE 来配置它以与我的编译器一起工作,我想使用 Notepad++ 但我找不到在文本上加下划线或标记错误的方法。有什么建议么???

0 投票
3 回答
522 浏览

c# - 在我的编译器中编写单元测试(生成 IL)

我正在编写一个Tiger编译器,C#并将Tiger代码翻译成IL.

在我的 AST 中实现每个节点的语义检查时,我为此创建了许多单元测试。这很简单,因为我的CheckSemantic方法如下所示:

所以,如果我想为某个节点的语义检查编写一些单元测试,我所要做的就是构建一个 AST,并调用该方法。然后我可以做类似的事情:

或者

但我现在开始生成代码,我不知道在为那个阶段编写单元测试时有什么好的做法。

我正在使用ILGenerator类。我想过以下几点:

  1. 生成我要测试的示例程序的代码
  2. 将生成的代码另存为test.exe
  3. 执行text.exe并将输出存储在results
  4. 反对results

但我想知道是否有更好的方法?

0 投票
1 回答
67 浏览

antlr - Antlr,可能导致与另一个相同的规则

对于一个编译项目,我和我的团队正在用 Antlr 定义一个语法。我们目前对这些规则有疑问:

如您所见,左值可以产生 ID,从而导致非 LL( ) 语法。所以我的问题是:我们如何修改语法以使其成为 LL( ) 而不允许额外的东西。

先感谢您 !

0 投票
2 回答
228 浏览

parsing - ML-Yacc Tiger Parser 减少/减少错误

我正在通过 Appel 的“现代编译器在 ML 中实现”一书中生成 Tiger Parser 的 Ch3 编程练习。我的tiger.grm 文件在这里。我试图诊断的错误是由一元和二元减号运算符的规则引起的减少-减少冲突。这是 yacc 错误:

我已经定义了 UNARY 的优先级高于 MINUS,并在我的规则中使用%prec. 当然,当我删除任一规则时,冲突就会消失,但语法会错误地解析 MINUS 符号。

我无法诊断此错误 - 有什么想法吗?

0 投票
0 回答
661 浏览

parsing - 用于编译器的 Tiger 语言解析器

我现在正在尝试使用 C 中的现代编译器实现一书(Tiger 书)来构建编译器。我现在陷入了解析器阶段。我已经建立了我的语法并尝试运行它,但仍然遇到一些语法错误。我尝试了我的词法分析器,它似乎可以工作。

这是我的 yacc/bison 代码:

当我在一个示例老虎代码上运行我的解析器时,我得到了一些语法错误,包括在开头。

你能帮我整理一下吗?谢谢!

0 投票
1 回答
311 浏览

parsing - ML-Yacc Tiger Parser 无法正确解析左值

我正在使用 ML-Yacc 在 SML中处理我的Tiger 编译器的解析器组件。我的语法文件找不到任何明显的问题(我使用优先级规则来解决所有移位减少冲突),但它似乎永远不会使用 的第二个和第三个规则来减少lvalue,我指定如下:

的语法exp是:

在尝试 parsea[0] := 5时,我希望它使用第四exp条规则(其中lvalueis lvalue LBRACK exp RBRACK)减少。相反,Yacc 发现语法错误并使用第三条规则ASSIGN替换和解析。OFexp

类似的问题也发生在lvalue DOT ID.

0 投票
1 回答
144 浏览

ocaml - 标准 ML 实现文件中的定义是外部可见的(但不在签名文件中)

我正在将Tiger book中的 SML 入门代码转换为 OCaml。

让我感到困惑的是,在签名文件table.sig(如下)中,没有提及IntMapTable,但函子可以在另一个文件中访问而没有任何限制。

我的理解是,只有文件中的代码.sig可以访问外部模块,而不是文件中的代码.sml。不是这样吗?

此外,OCaml 中的等效代码可能是什么样的?这很尴尬,因为 functorIntMapTable的结果类型是Table,它是文件的封闭模块。

0 投票
0 回答
40 浏览

parsing - 为什么tiger(现代编译器实现)在第4章使用`fundecs`而不是`fundec`?

我正在按照老虎书编写编译器。

在第 3 章中,根据 github 的代码和我的理解,我为 : 填写了以下规则dec

但是,在第 4 章中,本书为 ast 提供了以下功能:

这充分利用了我发现的代码调整decs令牌如下

列表标记fundecs并被tydecs添加到生产规则中。

我不明白为什么要这样做,因为这显然会产生冲突。因为decs是一个列表可以包含fundecstydecs。因此fundecs,例如 的列表可以简化为decs 的列表或 s 的列表fundec

因此我想问为什么要这样做,为解析器添加冲突语法的原因是什么?

非常感谢!!!