我正在为我班上的一个项目工作。 我正在使用Flex(lex)Bison(YACC)和C构建编译器。我只做了一些语义分析,但我一直在思考如何实现面向对象的部分。 也就是说,我如何处理类,重载,多态和遗产。

我似乎无法在谷歌上发现一些有用的东西,而龙书的水平太低了。 我的意思是过于专注于从头开始构建编译器。 所以我希望有人可以指点我一本好书,教程,例子,这些东西可以帮助我消除疑虑。

在此先感谢您的帮助,如果有人认为这是要求完成我的作业,我很抱歉。

===============>>#1 票数:3 已采纳

我同意第一个评论,即这个问题太广泛而无法回答。 但无论如何我会尝试。

您的问题有几个方面:

  1. 面向对象编程常用概念的语义是什么?
  2. 它们如何在编译器中实现?
  3. 它们通常如何在其他编译器中实现?
  4. 什么是进一步研究的好资源?

语义

语言之间存在很大差异,对于OOP的实际含义也存在很多混乱/争议(关于该主题的一个很好的演示文稿: http//www.infoq.com/presentations/It-Is-Possible-to-Do- OOP-in-Java ,它也有一些实现OOP功能的例子)。 只需选择一个模型并查找定义语义的引用,例如语言规范或模型上的科学论文。

Javascript可能是最容易实现的模型,因为它非常直接映射到实现,而编译器中没有太多必要的周围框架。 Java模型的静态版本(编译时类编译而不是运行时类加载)也不应该太难。 更复杂的模型是C ++(允许多重继承)和Smalltalk或Common Lisp / CLOS(使用元对象协议)。

可能的实施

再次广泛的选择。 由于语义是固定的,而且大部分都是直接的,因此实现工作最大程度上取决于您要归档的性能和编译器的现有基础结构。 将所有内容存储在列表中并扫描它们以获得满足规则的第一个条目可能是最简单的实现。

通常的实施

Java / C#/ C ++区域之外的大多数编程语言执行静态编译时名称/签名查找以查找所引用事物的定义,并使用http://en.wikipedia.org/wiki/Virtual_method_table来解析多态调用。 他们还使用Vtable指针作为instanceof -checks并检查向下转换。

资源

虽然只有30页与对象直接相关,但我仍然认为Lisp in Small Pieces(LiSP)是一本很好的书,可以在编译器中学习该级别的工作。 它专注于实现语言功能,实现中的权衡以及将各个部分组合在一起。 (如果(你可以克服使用的语法)(这很棒))。

  ask by Ccortina translate from so

未解决问题?本站智能推荐:

1回复

从名称编译器设计创建电子邮件地址

创建电子邮件地址表单名称 您给了一个包含几个人的名字的文件。 该文件的每一行将只有一个名称。 您需要从这些名称中创建以@ bitmesra.ac.in结尾的电子邮件地址。 创建电子邮件地址的规则定义如下:名称将以以下形式表示:............ 令F(s)表示字符串s的第
2回复

编译器设计代码来解析goto和块

有人可以帮我理解如何为C程序解析lex和yacc文件来解析goto和blocks(labels)。 这是我在网上找到的一些示例: 但是如何唯一地标识标签。 有人可以给我举这个例子或提到的任何链接的例子。
1回复

如何获得使用Lex和Yacc程序编写的编译器的解析器树?

我已经使用Lex和Yacc编写了一个程序,我想知道如何使用该程序获取该程序的解析器树,谁能给我代码来获取它吗? 我已经使用了gcc lex.yy.c y.tab.c -o project.exe
1回复

跟踪编译器中AST节点的源位置(ocaml)

我正在使用ocamllex / yacc在ocaml中编写编译器。 事情进展顺利,但我遇到了设计问题。 对于我创建的每个AST节点,最好在源代码中获得有关该节点的行/字符位置的信息。 这对于稍后向用户提供错误消息将是有用的。 现在,我可以为我的节点添加某种元类型: 但这似乎是
1回复

解析编译器语法和错误恢复错误

我目前正在学习如何在Lex&Bison中编程。 我已经编写了以下程序,但似乎它的递归性和错误恢复都有很大的问题。 它始终在打印第一个错误后停止。 我已经读过有关yyerrok和yyclearin的文章,但我无法使其正常工作。 任何帮助或一些教程的一些链接将不胜感激。 cmp.y:
3回复

如何编译使用Yacc和Lex构建的程序?

如图所示,我的Yacc源位于pos.yacc中,而我的Lex源位于pos1.lex中。 pos1.lex pos.yacc 编译错误 编译时出现如下错误: 是什么原因导致这些错误? 我应该如何编译Lex和Yacc源代码?
2回复

编译器如何在解析器过程中区分负数和负数

嘿,我最近参与了一个编译器开发人员,我遇到了负号(-)和负数(-1)的问题。 假设现在我有5--3、5 + -3,如何编写语法规则,以便在抽象语法树构建期间,yacc会生成正确的抽象语法树? 我的语法像: expr : constant {} | id {} | exec_expr {} e
1回复

Yacc和Lex错误编译

我正在尝试编译并执行以下简单程序: calculator.y calculator.l 所以我用命令编译: 然后我尝试链接和编译文件: 但是我有以下错误: 谁知道如何解决? 提前致谢。
1回复

以下语法的解析器程序

编写一个解析器(Yacc和Lex文件),使用以下生成和动作: 指示当输入为cacba时将打印的字符串。 我收到此错误:输入信息时,它表示有效输入,还表示语法错误。 我的扫描仪代码是这个 我的yacc代码是这样的: 我怎样才能解决这个问题?
1回复

使用Yacc和Lex设计处理多个类型的计算器

我是Compiler建筑物的新手。 Google可以找到== * /操作的许多示例,但是lex中这些示例中的标记通常仅处理一种类型,例如%token<DOUBLE> NUMBER ,然后处理yacc中的表达式类型也将是DOUBLE,例如%type<DOUBLE> exp