tinyPython 4

ANTLR를 이용한 tinyPython to Jasmin 컴파일러 만들기. - 完

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. - Test.tpy 컴파일링 과정 따라가보기 def sum(a, b): return a + b a = 3 b = 4 c=sum(a,b) print(c) if a>=3: print(a) elif b3: print(3) else: print(c) while c file_input -> defs 순으로 먼저 파싱이 될 것이다. program이 파싱될 때, enterProgram이 실행될 것이다. 따라서 .class public Test ~ .end method까지 결과 파일에 기록되게 된다. 그 후 실행된 file_input에는 별다른 enter, exit method를 정의해주지 않았으므로 바로 enterDefs가 실행된다...

ANTLR를 이용한 tinyPython to Jasmin 컴파일러 만들기. - 7

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 1. enterExpr @Override public void enterExpr(tinyPythonParser.ExprContext ctx) { if(ctx==null || visitedNodes.contains(ctx)){ return; } if(ctx.NUMBER()!=null){ visitedNodes.add(ctx); this.result+=("bipush "+Integer.parseInt(ctx.getChild(0).getText()))+"\n"; }//상수 load else if(ctx.NAME()!=null){ visitedNodes.add(ctx); if(table.contains(ctx.getChild(0..

ANTLR를 이용한 tinyPython to Jasmin 컴파일러 만들기. - 6

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 1. enterDef_stmt @Override public void enterDef_stmt(tinyPythonParser.Def_stmtContext ctx) { if(visitedNodes.contains(ctx)){ return; } visitedNodes.add(ctx); tempFuncFormat+=(ctx.getChild(1).getText()+"("); this.result+=(".method public static "+ctx.getChild(1).getText()+"("); enterArgs((tinyPythonParser.ArgsContext)ctx.getChild(3));//파라미터들을 로딩해서 ta..

ANTLR를 이용한 tinyPython to Jasmin 컴파일러 만들기. - 5

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 1. enterIf_stmt @Override public void enterIf_stmt(tinyPythonParser.If_stmtContext ctx) { if(visitedNodes.contains(ctx)){ return; } visitedNodes.add(ctx); if(ctx.getChildCount()5+3) 일 시 enterTest로 들어오는 a>5+3에 대해 goto를 작성해주고, a를 load한 다음, 5+3을 계산하여 스택에 load 해둔다. 더보기 (ex: iload_0, bipush 5, bipush 3, iadd를 실행한다. 그 뒤 스택의 구조는 다음과 같이 되어있을 것이다.) 이후, >이 co..