<分区>
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,
visit the help center 指导。
关闭10 年前 。
我想用 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" 是一个。