TheSuperTinyCompiler

项目介绍

将lisp风格的函数转换为C风格的函数
*                  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))

涉及的知识点

该项目虽小,却向我们展示了编译器的一些东西: 词法分析,抽象语法树,语法树遍历等

词法分析

    public List<Token> tokens(String input) throws Exception {

        List<Token> tokenList = new ArrayList<Token>();
        int currentPos = 0;
        while (currentPos < input.length()) {

            char currentChar = input.charAt(currentPos);

            if ('(' == currentChar) {
                tokenList.add(new Token().setType("paren").setValue("("));
                currentPos++;
                continue;
            } else if (')' == currentChar) {
                tokenList.add(new Token().setType("paren").setValue(")"));
                currentPos++;
                continue;
            } else if (Character.isWhitespace(currentChar)) {
                currentPos++;
                continue;
            } else if (Character.isDigit(currentChar)) {
                StringBuilder digitsBuilder = new StringBuilder();
                while (Character.isDigit(currentChar)) {
                    digitsBuilder.append(currentChar);
                    currentChar = input.charAt(++currentPos);
                }
                tokenList.add(new Token().setType("number").setValue(digitsBuilder.toString()));
                continue;
            } else if (isAlphabet(currentChar)) {
                StringBuilder charsBuilder = new StringBuilder();
                while (isAlphabet(currentChar)) {
                    charsBuilder.append(currentChar);
                    currentChar = input.charAt(++currentPos);
                }
                tokenList.add(new Token().setType("name").setValue(charsBuilder.toString()));
                continue;
            } else {
                throw new Exception("I dont know what this character is: " + currentChar);
            }
        }
        return tokenList;
}

语法树

* 它的抽象语法树(AST)看起来或许是这样的:
*   {
*     type: 'Program',
*     body: [{
*       type: 'CallExpression',
 *       name: 'add',
 *       params: [{
 *         type: 'NumberLiteral',
 *         value: '2'
 *       }, {
 *         type: 'CallExpression',
 *         name: 'subtract',
 *         params: [{
 *           type: 'NumberLiteral',
 *           value: '4'
 *         }, {
 *           type: 'NumberLiteral',
 *           value: '2'
 *         }]
 *       }]
 *     }]
 *   }

项目github地址(Java实现版本)

https://github.com/AnoxiaTown/TheSuperTinyCompiler

JS中文版

https://github.com/starkwang/the-super-tiny-compiler-cn/blob/master/super-tiny-compiler-chinese.js

JS英文原版

https://github.com/jamiebuilds/the-super-tiny-compiler

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,351评论 25 708
  • 摸索「照片命名管理技巧」时找到的最好的解决方案就是图中这款软件。它可以将照片文件属性的“修改时间”或“Exif信息...
    文质彬彬0阅读 2,733评论 0 0
  • 第六天(牛海霞瘦包专业课) 亲爱的伙伴大家晚上好,最近那咱们群里面进了好多新人好多新代理。对...
    一直一直瘦一下阅读 309评论 0 0
  • 由于天气原因,原计划在宝宝家住两天饿我们提前返程了。感触如下: 1.有车真是很方便,之前没车的时候过年去我家真的好...
    云牵阅读 214评论 0 0

友情链接更多精彩内容