我想了解转译器的工作方式。最好的办法是写一门类(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解析器具有以下内容:publicfunctionmyFunc。它怎么知道应该将其映射到:myFunc = function ...?

    任何人都应该在transpiler中完成此操作的任何有用的实用信息?还是为此工作编写了lexical分析器会出错吗?

    编辑

    因此,显然我的词法分析器/解析器如何工作的想法并不完全正确。非常欢迎有关此过程如何工作的任何“伪”信息(带有伪示例)。

    最佳答案

    我强烈建议您看看Decaf compiler project

    一般来说,编译器或翻译器只是未经优化的编译器。

    这是编译器(在这种情况下为编译器)阶段的概述。

  • 词法分析:这将输入流转换为 token 。 token 是语言中最小的有意义单位。例如,关键字,花括号,标识符。 token 通常可以用正则语言(或等效的正则表达式)描述,因此,词法分析器通常使用正则表达式来扫描输入流以创建分类 token 。
  • 解析:一般来说,解析器需要将 token 流转换为Abstract Syntax Trees。这使我们可以从输入中收集更多的含义和结构。例如,“(id:x)(operator:=)(id:y)”可以是传入 token 流,然后解析将输出以(operator:=)为根,(id:x)为根的树。左 child ,(id:y)为右 child 。 AST的结构取决于语言的语法。您的解析器通常会执行语言语法。
  • Semantic Analysis:这是您进行AST并从输入中收集所需的其他信息的地方。一个典型的例子是类型检查。
  • 优化:经过语义分析后,编译器通常会执行某种程度的优化。在编译器/翻译器的情况下,可能不需要优化。
  • 代码生成:这是您将一种语言“映射”到另一种语言的部分。生成器将获取每个AST并生成其指示的代码。在普通的编译器中,这会生成汇编代码或机器代码。在翻译器/编译器中,您只需要为所需的特定语言编写生成器即可。

  • 当然,此列表非常实用,但我希望它能帮助您更好地了解您的项目!

    关于compiler-construction - 将编译器编写到实际映射发生的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12753374/

    10-09 06:42