可以用Javascript编写编译器吗?

时间:2011-09-08 05:31:39

标签: javascript compiler-construction

是否可以使用Javascript编写可以支持其他语言编写的编译器?

让我们说,我有一段HTML。

<script language="cpp" id="cppScriptBlock" EntryPoint="main">
    int main() {
        cout << "<h1>CPPHeader</h1>";
    }
</script>

<script language="java" id="javaScriptBlock" EntryPoint="MyJavaClass">
    public class MyJavaClass {
        public final void main() {
            java.lang.System.out.println("<h1>JavaHeader</h1>");
        }
    }
</script>

<script language="csharp" id="csharpScriptBlock" EntryPoint="MyCSharpClass ">
    public class MyCSharpClass {
        public static void Main() {
            System.Console.WriteLine("<h1>CSharpHeader</h1>");
        }
    }
</script>


<script language="javascript">
    $("#cppScriptBlock").compileAndRun();
    $("#javaScriptBlock").compileAndRun();
    $("#csharpScriptBlock").compileAndRun();
</script>

最后生成以下HTML

<h1>CPPHeader</h1>
<h1>JavaHeader</h1>
<h1>CSharpHeader</h1>

有可能吗?

亚历

7 个答案:

答案 0 :(得分:17)

是的,使用Jison非常有可能。

它根据您定义的语言结构生成JavaScript解析器。

  

Jison将无上下文语法作为输入并输出JavaScript   能够解析该语法描述的语言的文件。您   然后可以使用生成的脚本来解析输入并接受,拒绝,   或根据输入执行操作。

- 来自documentation

PS:CoffeeScript!也是用这个创建的。 :)

答案 1 :(得分:7)

是的,但是你需要做很多工作。就像真正的编译器一样,您必须解析代码,将其转换为中间代码等。之后,您必须模拟环境,包括这些语言中包含的所有运行时库。简而言之,这是不切实际的,但它是可能的。

答案 2 :(得分:7)

是的,Javascript是Turing Complete。您可以使用任何语言编写代码中的任何内容。当然,这包括编译器。我无法想象有任何理由这样做过。如果你已经足够Javascript来编写编译器,你可能只想用javascript而不是其他语言编写代码。

答案 3 :(得分:2)

请参阅Metacompiler tutorial,了解如何使用Javascript作为实现语言来编写任意编译器(和编译器编译器)。

答案 4 :(得分:1)

你应该看一下JS诱人的语言。具体如下:

答案 5 :(得分:1)

是的,有可能。但是,我不鼓励你手动编写解析器,而是鼓励你使用一个好的解析器生成器。

例如,Terence Parr的ANTLR是一个非常强大的解析器生成器,具有a JavaScript target。它适用于支持ECMAScript 5.1的环境。 (在Firefox,Safari,Chrome,Internet Explorer和Node.js中测试过)。它是开源的(BSD许可证),包含大量文档和非常好的书籍。

使用这样的工具,而不是编写自己的解析器,编写语法并为您生成解析器。

答案 6 :(得分:0)

是的,这是可能的。

然而,编写一个从一种语言转换为Javascript然后让浏览器处理字节代码生成和执行的解释器会更容易。