我如何在javascript中为此编写解释器?

时间:2011-12-02 04:11:14

标签: javascript scripting

我想在javascript中为脚本语言编写一个解释器。可以运行此脚本的东西:

set myVariable to "Hello World"
repeat 5 times with x
begin
    set myVariable to myVariable plus " " plus x
end
popup "myVariable is: " plus myVariable

以上的等效javascript将是:

var myVariable = "Hello World";
for (var x=1; x<=5; x++) {
    myVariable += " " + x;
}
alert("myVariable is: " + myVariable);

我不想从一个翻译到另一个,我想编写一个javascript程序来直接解释和执行脚本。怎么办呢?

更新

我正在寻找一个教程(最好用javascript,但C会做),这将引导我完成这个。我想我正在寻找一个不使用任何外部工具的工具,因为工具似乎是我的问题。我不想使用调用库和一堆预构建代码的东西。我希望看到整件事,从头开始。

3 个答案:

答案 0 :(得分:8)

好吧,我实际上会尝试稍微解决这个问题......虽然我无法将你需要知道的所有内容提炼成几句甚至段落。

首先,您应该了解/熟悉构建编译器所涉及的内容。你说你想“解释”代码 - 但是,我认为你真正想要的是将代码编译为Javascript(以及Javascript中)。

维基百科有一个关于这个主题的精彩页面:http://en.wikipedia.org/wiki/Compiler

事情的要点是:

1。)将文本(源代码)转换为某种内存中的数据结构(abstract syntax tree - AST),它实际上可以让您推断出已经给出的程序结构。

2.。)鉴于该结构,产生您的输出(在这种情况下为Javascript)。

进一步细分步骤1 - 定义你的grammar例如;这种新语言的有效语法是什么,什么不是?通常情况下,最好在纸上用BNF来推断这类事情(或者你使用的工具更喜欢哪种语法 - 尽管(E)BNF是标准)。关于这一步骤的挑战性部分不仅是完成解析源代码的繁琐工作 - 还要确保你已经提出了明确的易于解析的语法。这两个要求实际上比你想象的要难得多。

我在C#中构建了一个LALR解析器生成器 - 我可以告诉你,除非你之前已经构建了一个,否则这不是一项微不足道的任务。除此之外,有很多好的,除非你真的想知道它是如何为它的乐趣而工作的,或者因为你是这样的事情,使用解析器更有意义 - 别人写的发电机。关于解析器生成器的好处在于它将采用您已经想到的语法定义将其转换为将在另一端吐出AST的程序。这是为您完成的大量工作。事实上,Javascript还有一些:

http://www.google.com/search?q=javascript+parser+generator

PEG.js – Parser Generator for JavaScript

JS/CC Parser Generator Project Homepage

转到第2步。对于诸如中缀表达式之类的内容,此步骤可能非常基础 - 或者它可能变得非常复杂。但是,给定AST的想法是将其“转换”为输出格式(Javascript)。通常,您需要检查解析器中发生的“简单”语法检查未检查的内容。例如,即使在您的示例代码中,也有许多可能出错的事情。在您说plus x的部分中,如果开发人员从未定义x会发生什么?这应该是一个错误吗? x应该默认值吗?这是您的语言真正发挥作用的地方。并且,要回溯一分钟 - 您需要花费在此步骤上的时间 - 而不是解析器。使用工具 - 认真。你正在谈论开始一个大型且具有挑战性的项目 - 不要让自己变得更难。要添加所有这些 - 通常需要通过AST进行多次“传递”。例如,第一遍可以查找并设置“模块”定义,第二遍可以查找并设置“命名空间”,另一遍可以设置类等。最终应用程序的结构的这些进一步改进在稍后使用确定对特定类/变量/模块/等的引用是否有效的步骤(实际存在或可以引用)。

关于编译器,有一些非常棒的书。臭名昭着的"dragon book"就是一个。

答案 1 :(得分:2)

你显然想要实现的是写一种新语言。如果我正确,那么你将不得不通过以下流程:

  • 定义识别您的语言的语法。
  • 将此语法提供给JS / CC(here,生成Javascript),SableCC(here,生成Java)或antlr(here,生成大量语言)等工具,这将为你提供一个解析器。
  • 然后,您将能够根据解析器生成器为您提供的语言为您的语言实现解释器(甚至是编译器,如果您需要的话)。

我只使用了SableCC,这是一个非常强大的工具,在网站上提出的档案中有很多简单的语法示例可能会指导你。

希望这有帮助。

答案 2 :(得分:0)

您获得的许多答案都集中在制作评估者的解析部分。有关编写语言语义的处理,请参阅Programming Languages: Application and Interpretation