我想了解转译器的工作原理。最好的办法是写一篇ofcourse。
从理论上讲,我一直在研究一些资源以了解其工作原理。我了解以下内容:
据我了解,我基本上需要编写两个类:
- 词法分析器
- 解析器
词法分析器
将Lexical Analyzer
文件的源代码作为输入(输入流)。例如下面的代码:
if (someVar == 20) {
MessageBox("Hello World!");
}
然后Lexical Analyzer
创建数据块:
[if]
[ ]
[(]
[someVar]
[ ]
[==]
[ ]
[20]
[)]
[ ]
[{]
[\n]
[\t]
[MessageBox]
[(]
["]
[Hello World!]
["]
[)]
[;]
[\n]
[\t]
[}]
然后将其发送给Parser
班级。
解析器
然后Parser
该类将读取所有标记块(?)并指定每个标记(?)的含义。它将为其分配某种类型。因此,上述字符串的结果将被标识为:
[if] // Keyword
[ ] // Whitespace
[(] // L_Parenthesis
[someVar] // Identifier
[ ] // Whitespace
[==] // Operator
[ ] // Whitespace
[20] // Number (or Integer)
[)] // R_Parenthesis
[ ] // Whitespace
[{] // L_Bracket
[\n] // Whitespace
[\t] // Whitespace
[MessageBox] // Keyword
[(] // L_Parenthesis
["] // Not yet sure where this would go
[Hello World!] // Same..
["] // Same...
[)] // R_Parenthesis
[;] // Semicolon
[\n] // Whitespace
[\t] // Whitespace
[}] // R_Bracket
正如你所看到的,我还没有完全弄清楚哪些类型到底在哪里。但这应该是基本思想。
现在我想做的下一件事就是将该源代码转换为另一个源代码,从而对其进行转译。但这是如何工作的?我找不到任何直接的教程和解释。
假设我有以下自定义代码:
def myVar = true;
public function myFunc ( def arg1 )
{
if ( arg1 == true ) {
MessageBox("My Message");
}
}
然后 Lexical 进程将解析这段代码。那么我如何将其转换为 Javascript 之类的东西?
var myVar = true;
myFunc = function ( arg1 )
{
if ( arg1 == true ) {
alert("My Message");
}
}
从我的自定义 cdoe 到像 Javascript 这样的代码,映射是如何工作的?比如函数声明。我的Lexical
解析器具有以下内容:public
, function
, myFunc
. 它怎么知道它应该映射到:myFunc = function
...?
任何人都可以提供有关如何在其中完成此操作的任何有用且实用的信息transpiler
?或者我lexical
为这份工作编写分析器是不是错了?
编辑
所以很明显我的词法分析器/解析器如何工作的想法并不完全正确。任何有关此过程如何工作的“伪”信息(带有伪示例)都非常受欢迎。