GithubHelp home page GithubHelp logo

richardgong / playwithcompiler Goto Github PK

View Code? Open in Web Editor NEW
854.0 35.0 389.0 17.37 MB

A GeekTime course about constructing a compiler.

Java 52.76% ANTLR 5.06% JavaScript 0.09% C 0.29% CMake 0.89% C++ 38.11% Makefile 1.04% Assembly 1.67% HTML 0.05% Common Lisp 0.04%
compiler compiler-design compiler-construction compilation

playwithcompiler's People

Contributors

richardgong avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

playwithcompiler's Issues

好像是bug

SimpleLexer::tokenize代码,解析token之后,好像没看到放到tokens中去。
//tokens = new ArrayList();

空指针 from play.TypeResolver.exitFormalParameter(TypeResolver.java:96)

你好。我运行PlayScript with "-v scratch.play", 得到这个NPE(在函数调用那个例子)。
或者这个简单的例子 String script = "int b= 10; int myfunc(int a) {return a+b+3;} myfunc(2);";
Exception in thread "main" java.lang.NullPointerException
at play.TypeResolver.exitFormalParameter(TypeResolver.java:96)
at play.PlayScriptParser$FormalParameterContext.exitRule(PlayScriptParser.java:940)
at org.antlr.v4.runtime.tree.ParseTreeWalker.exitRule(ParseTreeWalker.java:47)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:30)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:28)
at play.PlayScriptCompiler.compile(PlayScriptCompiler.java:38)
at play.PlayScript.main(PlayScript.java:96)

运行环境: Windows10 64bit + JDK8 + IntelliJ2019

查看了一下你的提交记录,这个NPE应该是你在提交这个的时候引入的
"delayed the TypeResolve of local variable. local variable symbols are…" on April 14th. d2b29fe

谢谢

使用Gradle重新组织了playscript-java项目

在看《编译原理之美》过程中自己花了些时间用Gradle组织了playscript-java这个项目,还包括使用层级的结构组织代码和写了一个简单的集成测试,也许对其他人有些用处。

项目地址

吐槽一下:
虽然有优秀的IDEA支持,写一个Java非SpringBoot项目还是太浪费时间(可能IDEA的团队在开发的时候,就是实在受不了Java表达能力的捉急的才开发了Kotlin)。特别是看到ASTEvaluator里面那些处理计算的代码,我真的佩服宫老师居然能花那么多时间去搬砖(这些代码我是不管统一的编码风格,直接copy了)。

做编译前端的语言关键得有一个原生的模式匹配和函数头等成员的支持,要不然写起来太累太费时间,所以我这个项目就是支持到成功运行样例的程度,没有很强的动力去拓展别的。

老师好,建立了一个编译原理课程的交流群

宫老师
您好!
买了您的《编译原理之美》跟《编译原理实战》的专栏,在这两个专栏中获益匪浅。但是在看专栏学习过程当中,遇到一些问题跟困难,也看到其他同学也有相同疑惑,希望建立一个微信交流群,方便大家在学习这两个专栏时可以相互沟通交流。

老师好,能否建立一个编译原理课程的交流群呢

在学习过程中遇到了一些困难,反复看了几遍文章,把评论区也翻了几遍,也看到其他同学有相同疑惑,没有答复。

接下来不知道该如何进行下去了。心中存有疑惑,找不到合适的解惑渠道。

老师能否提供一个交流群,方便同学们在里面交流。新来的同学向学过的同学请教

FirstClassFunction.play中bar函数在java版本解释器中无法正确调用

环境:playscript-java与FirstClassFunction.play

问题描述:当解释执行FirstClassFunction.play文件时,该文件中的bar(foo);函数无法正确执行。

产生原因:解释执行bar(foo);时,解释器无法找到bar函数。其原因是进行闭包foo匹配时,由于foo调用多次从而导致返回参数类型个数不停的增加,从而导致函数匹配失败。

public class Function extends Scope implements FunctionType {

    ...

    @Override
    public List<Type> getParamTypes() {
        if (paramTypes == null) {
            paramTypes = new LinkedList<Type>();
        }
        //当某个函数调用多次时,paramTypes的数量会不停的增加
        for (Variable param : parameters) {
            paramTypes.add(param.type);
        }

        return paramTypes;
    }

    ...

解决方案1:进行去重操作,判断param.type是否是同一对象,如果不是,才添加到paramTypes集合中。

public class Function extends Scope implements FunctionType {

    ...

    @Override
    public List<Type> getParamTypes() {
        if (paramTypes == null) {
            paramTypes = new LinkedList<>();
        }
        for (Variable param : parameters) {
            boolean isExist = false;
            //由于函数参数注定不会很多,所以认为这里使用for循环的时间复杂度可接受
            for (Type type : paramTypes) {
                if (type == param.type) {
                    isExist = true;
                    break;
                }
            }
            if (!isExist) {
                paramTypes.add(param.type);
            }
        }
        return paramTypes;
    }

    ...
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.