美文网首页
编译原理:super-tiny-compiler源码阅读

编译原理:super-tiny-compiler源码阅读

作者: 枸杞辣条 | 来源:发表于2021-12-11 23:50 被阅读0次

在日常工作中我们很少能接触到编译相关,但是确是一个很重要的一个知识。作者@ jamiebuilds通过一个简单的案例用最小的实现方式展现了一个简单demo的编译器。https://github.com/jamiebuilds/the-super-tiny-compiler

super-tiny-compiler 主要是将lisp语言的函数调用转换成C语言(你也可以理解JS的函数调用)

Aim LISP C
2 + 2 (add 2 2) add(2, 2)
4 - 2 (subtract 4 2) subtract(4, 2)
2 + (4 - 2) (add 2 (subtract 4 2)) add(2, subtract(4, 2))

编译分为哪几个阶段(Stage)?

  1. 词法解析parse,将原始的代码经过词法分析转成抽象树
  2. 转换器Transformation,将抽象树转换成编译器需要的结构
  3. 代码生成Code Generation,将转换过的抽象树转换成目标代码

tokenizer

将代码拆解成一个一个的token

(add 2 (subtract 4 2))转换成:

[
  { type: 'paren', value: '(' },
  { type: 'string', value: 'add' }
  // ...
]

parser

接收一个tokens,将tokens转换成AST。

function parser(tokens) {
  let current = 0;
  
  function walk() {
    // 匹配左括号
    let token = tokens[current]; 
    if (token.type === 'number') {

      current++;

      return {
        type: 'NumberLiteral',
        value: token.value,
      };
    }
    if (token.type === 'string') {
      current++;

      return {
        type: 'StringLiteral',
        value: token.value,
      };
    }
    if (
      token.type === 'paren' &&
      token.value === '('
    ) {
      token = tokens[++current];
      let node = {
        type: 'CallExpression',
        name: token.value,
        params: [],
      };
      token = tokens[++current];

      while (
        (token.type !== 'paren') ||
        (token.type === 'paren' && token.value !== ')')
      ) {
        node.params.push(walk());
        token = tokens[current];
      }
      
      current++;
      return node
    }
  }
  let ast = {
    type: 'Program',
    body: [],
  };

  while (current < tokens.length) {
    ast.body.push(walk());
  }

  return ast;
}

transformer

将旧AST转换成与之相代码结构对应的新AST

相关文章

  • 编译原理:super-tiny-compiler源码阅读

    在日常工作中我们很少能接触到编译相关,但是确是一个很重要的一个知识。作者@ jamiebuilds[https:/...

  • 20170922周五开会小结

    StormOnYARN源码阅读 下载StormOnYARN源码并且编译运行成功 根据StormOnYarn整体架构...

  • 编译Android源码

    「Do.016」AndroidStudio不用编译,阅读Android源码 - 掘金 自己动手编译Android源...

  • MJRefresh

    MJRefresh原理分析从MJRefresh源码学习上拉下刷新的基本原理MJRefresh源码阅读使用Xtrac...

  • 编译Spring

    编译Spring 为了深入了解Spring-Framework,阅读项目源码,第一步是编译源码。 代码地址如下 h...

  • spring源码阅读-环境搭建【01】

    《spring-framework源码阅读001》 源码下载编译步骤 一、下载源码 github下载速度慢,需要v...

  • Android TV按键焦点原理浅谈

    本篇主要阅读Android源码讲解TV的按键事件分发原理和焦点查找原理,源码基于Android9.0,首先思考几个...

  • Android TV按键焦点原理浅谈

    前言 本篇主要阅读Android源码讲解TV的按键事件分发原理和焦点查找原理,源码基于Android9.0,首先思...

  • NullSafe原理

    NullSafe原理NullSafe 的原理是什么?处理json里的null值+NullSafe源码阅读

  • Pl0编译器源码阅读

    写在前面 其实这个是我的编译原理一次作业的草稿,也是第一次阅读编译器的源码,虽然比较简单,但是也是第一次,分享一下...

网友评论

      本文标题:编译原理:super-tiny-compiler源码阅读

      本文链接:https://www.haomeiwen.com/subject/dgabgltx.html