Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我该如何用javascript为其编写解释器?_Javascript_Scripting - Fatal编程技术网

我该如何用javascript为其编写解释器?

我该如何用javascript为其编写解释器?,javascript,scripting,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

我想用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);
var myVariable=“Hello World”;

对于(var x=1;x你显然想要达到的是写一种新的语言。如果我是对的,那么你必须经历以下过程:

  • 定义一个能识别你的语言的语法
  • 将此语法提供给JS/CC(,generating Javascript)、SableCC(,generating Java)或antlr(,generating loth of languages)等工具,它们将为您生成一个解析器
  • 然后,您将能够根据解析器生成器将提供给您的内容为您的语言实现解释器(甚至是编译器,如果您需要的话)
我只使用了SableCC,这是一个非常强大的工具,在网站上提出的归档文件中有许多简单的语法示例可能会指导您


希望这能有所帮助。

好的,我会尝试解决这个问题……尽管我不可能把你需要知道的一切都提炼成几个句子甚至段落

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

Wikipedia在这个主题上有一个很棒的页面:

事情的要点是:

1.)将文本(源代码)转换为某种内存中的数据结构(),实际上可以让您对所给程序的结构进行推理

2.)给定该结构,生成输出(本例中为Javascript)

进一步分解步骤1-定义您的示例。;在你的这种新语言中,什么是有效语法,什么不是?通常情况下,最好在纸上对这类事情进行推理(或者使用您喜欢的任何语法-尽管(E)BNF是标准)。这一步最具挑战性的部分不仅是解析源代码的繁重工作,而且还要确保您已经提出了一个明确且易于解析的语法。这两个要求实际上比你想象的更难确定

我已经用C#构建了一个LALR解析器生成器——而且,我可以告诉你,除非你以前构建过一个,否则这不是一个简单的任务。除此之外,还有很多很好的方法,除非你真的想知道它是如何工作的,或者因为你对这类事情感兴趣,否则使用其他人编写的解析器生成器会更有意义。解析器生成器最棒的地方在于,它会将您提出的语法定义转换为一个程序,该程序会在另一端输出AST。这是为你做的大量工作。事实上,Javascript有几个方面:

继续执行步骤2。这一步对于中缀表达式之类的东西来说是非常基本的,也可能变得非常复杂。但是,考虑到AST,“转换”为您的输出格式(Javascript)。通常,您需要检查语法分析器中发生的“简单”语法检查没有检查的内容。例如,即使在示例代码中,也有许多可能出错的地方。在你说的
加x
部分中,如果开发人员从未定义
x
,会发生什么?这应该是一个错误吗?
x
是否应默认为某个值?这就是你的语言真正具有生命力的地方。而且,为了回溯一分钟,您需要将时间花在这一步上,而不是花在解析器上。使用一个工具,认真地说。你说的是开始一个大而有挑战性的项目——不要让它对你自己更难。除此之外,通常还需要通过AST进行多次“传递”。例如,第一个过程可能会查找和设置“模块”定义,第二个过程可能会查找和设置“名称空间”,另一个过程可能会设置类等。最终应用程序结构的这些进一步改进将在后面的步骤中使用,以确定对特定类/变量/模块/等的引用是否有效(它实际存在或可以被引用)


有几本关于编译器的好书。其中一本臭名昭著。

您得到的许多答案都集中在生成计算器的解析部分。有关编写语言语义的处理方法,请参阅。

您需要缩小问题的范围。@DmitryBeransky-标题就是问题。我将把它添加到bo中我想看看这篇文章的全部内容,从头开始。
,我希望你有时间……喝杯好咖啡。这是一篇比较晚的文章,但这是一篇用JavaScript编写解释器的好文章。它可能会给你一些ideas和howto:这是我在任何地方都能看到的答案。如果有示例,它们都会生成调用大量内置库函数的c/c++代码。我正在寻找一个简单的教程,指导我完成这一过程。我想我正在寻找一个指导我完成这一过程而不使用任何工具的教程。我想如果这是答案的话,你会知道的我知道这听起来并不容易,但没有人说写一门新语言很容易。从下面的列表中(),显然有4或5个可以生成Javascript。如果你试图用Javascript编写自己的解析器,这将比学习其中一个工具要困难得多,相信我。+1感谢你回答这个问题,即使它的票数是-1。@Steve谢谢,我实际上有点喜欢这个领域,并且很高兴我的大学给了我一个很好的c我们在这上面。所以我不会错过任何机会