我想了解转译器的工作方式。最好的办法是写一门类(class)。
从理论上讲,我一直在研究一些资源以了解其工作原理。我了解以下内容:
据我了解,我基本上需要编写两个类:
词法分析器
Lexical Analyzer
将文件的源代码作为输入(输入流)。例如下面的代码:if (someVar == 20) {
MessageBox("Hello World!");
}
然后
Lexical Analyzer
以此创建数据块:[if]
[ ]
[(]
[someVar]
[ ]
[==]
[ ]
[20]
[)]
[ ]
[{]
[\n]
[\t]
[MessageBox]
[(]
["]
[Hello World!]
["]
[)]
[;]
[\n]
[\t]
[}]
然后将其发送到
Parser
类。解析器
然后,
Parser
类将读取所有 token (?)块,并指定每个 token (?)的含义。它将为它分配某种类型。因此,上述字符串的结果将被标识为:[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");
}
}
然后,词法处理将解析此代码。那我怎么把它转换成类似Javascript的东西呢?
var myVar = true;
myFunc = function ( arg1 )
{
if ( arg1 == true ) {
alert("My Message");
}
}
从我的自定义cdoe到Javascript之类的代码,映射如何工作?像,函数声明。我的
Lexical
解析器具有以下内容:public
,function
和myFunc
。它怎么知道应该将其映射到:myFunc = function
...?任何人都应该在
transpiler
中完成此操作的任何有用的实用信息?还是为此工作编写了lexical
分析器会出错吗?编辑
因此,显然我的词法分析器/解析器如何工作的想法并不完全正确。非常欢迎有关此过程如何工作的任何“伪”信息(带有伪示例)。
最佳答案
我强烈建议您看看Decaf compiler project。
一般来说,编译器或翻译器只是未经优化的编译器。
这是编译器(在这种情况下为编译器)阶段的概述。
当然,此列表非常实用,但我希望它能帮助您更好地了解您的项目!
关于compiler-construction - 将编译器编写到实际映射发生的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12753374/