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

标签 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 也可以)来引导我完成这个过程。我想我正在寻找一个不使用任何外部工具的工具,因为这些工具似乎是我的问题。我不想使用调用库和一堆预构建代码的东西。我想看到整个事情,从头开始。

最佳答案

好吧,我实际上会尝试稍微解决一下这个问题...虽然我不可能将您需要了解的所有内容提炼成几句话甚至几段。

首先,您应该了解/熟悉构建编译器所涉及的内容。你说你想“解释”代码 - 但是,我认为你真正想要的是将代码编译为 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"是一个。

关于javascript - 我将如何在 javascript 中为此编写解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8351695/

相关文章:

javascript - 如何在redux中修改对象属性?

javascript - Meteor,向单选按钮添加事件会禁用它们

javascript - 根据内容删除 HTML 标签

scripting - VB6 解析器/词法分析器/脚本编写器

linux - 用于删除小于 xMB 的文件的 Shell 脚本

scripting - ANT 如何使用 Ant 1.8 中的词法作用域属性?

javascript - JS Node 的 for 和 foreach 循环问题

javascript - 函数完成后,重定向到 URL

linux - 从一个文件测试多个服务器的 telnet 连接

swift - 使 Cocoa 应用程序可编写脚本 Swift