【问题标题】:Creating a language interpreter创建语言解释器
【发布时间】:2010-03-10 00:05:11
【问题描述】:

我正在尝试了解语言解释器的工作原理。你们能给我指出口译员的工作原理吗?

我的意思是,假设我有一些这样写的行

10  x = 200;
20  for r = x to 1000 step 1
25  z = r + 32;
30  print z;
40  next r;
50  end;

构建一个可以运行类似程序的解释器的最佳方法是什么?

有一个包含所有允许函数的大型矩阵并搜索匹配项?第一行,例如:它是把 200 赋给一个变量 x,但是这些是不存在的符号。

如果你们能给我指路……

感谢您的帮助。

【问题讨论】:

  • 为此编写解释器(或编译器)是一件非常复杂的事情。我不是这方面的专家,但在我的大学里,他们有一门名为编译器技术的课程,我的几个朋友参加了该课程。如果我没记错的话,它由 4 个步骤组成,首先是编写一些代码模式(就像你已经拥有的那样),然后他们使用一个程序来查看它并找到模式,然后他们构建可用于构建树的标记的代码。然后他们构建编译器。如前所述,我对此了解不多,但有人告诉我这根本不容易。
  • 谢谢.. 这就是重点。我想大致了解一下。
  • 编译器和解释器资源的规范问题是stackoverflow.com/questions/1669/learning-to-write-a-compiler。那里列出了一些资源(如 Crenshaw 教程),它们的级别非常简单。

标签: programming-languages


【解决方案1】:

编译器的创建是一个复杂的话题(解释器可以看作是一种特殊的编译器)。

你必须先解析它——尝试理解语法,然后创建一些内部表示(抽象语法树),然后创建一些执行逻辑。

Wikpedia 建议http://mcs.une.edu.au/~comp319/

【讨论】:

  • AST 无疑是获得全方位服务的编译器或解释器的方法,但它不是必需的。
  • 对,不需要 AST,但需要一些理解……至少对于当前行/语句。
【解决方案2】:

也许您正在谈论创建 DSL。 您可能会发现这很有帮助(如果您愿意花 $$)

http://gilesbowkett.blogspot.com/2010/03/create-your-own-programming-language.html

【讨论】:

    【解决方案3】:

    我也有兴趣了解更多相关信息。我发现 Douglas Crockford 的 JavaScript parser 很有趣,尽管据我了解,他使用的方法与解析语言的典型方法不同。这不是解释和编译的全貌,但我发现查看一些实际的解析实现以及由此产生的代码重组很有帮助。

    【讨论】:

      【解决方案4】:

      您可以在http://goldparser.org 找到一个开源的“黄金解析系统”。 :)

      他们的网站上也有一些解释性概念,您可以在其中学习该过程的一些基本基础知识。

      【讨论】:

        【解决方案5】:

        我知道这是一个旧线程,但大多数相关问题都被标记为重复或已关闭。所以,这是我的两分钱。

        我很惊讶还没有人提到xtext。它以Eclipse pluginIntelliJ plugin 的形式提供。它不仅提供像 ANTLR 这样的解析器,还提供 DSL 所需的整个管道(包括解析器、链接器、类型检查器、编译器)。您可以在 Github 上查看它的源代码,以了解解释器/编译器的工作原理。

        【讨论】:

          【解决方案6】:

          了解lex/flexyacc/bison 等工具。这些是在开放软件世界中构建编译器的最流行工具。许多著名的开源程序都是使用它们编写的(包括 PHP、gcc、doxygen)。你会发现很多免费的书籍和教程。它们不仅展示了如何使用 lex 和 yacc 工具,还解释了编译器背后的一般思想。

          【讨论】:

          • 别忘了 ANTLR (antlr.org) 比 lex 或 bison 更复杂但非常相关。
          • 是的 ANTLR 值得一提。
          • 我认为 lex/yacc 对于初学者来说要容易得多。另外,shift-reduce 解析更容易理解。 OP 想学习,所以也许 lex/yacc 更适合这个目的;我都用过,发现 lex/yacc 作为初学者要好得多。
          猜你喜欢
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          相关资源
          最近更新 更多