是否可以使用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>
有可能吗?
亚历
答案 0 :(得分:17)
它根据您定义的语言结构生成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然后让浏览器处理字节代码生成和执行的解释器会更容易。