Jasmin 7

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 컴파일러 만들기. - 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..

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

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 1. enterAssignment_stmt @Override public void enterAssignment_stmt(tinyPythonParser.Assignment_stmtContext ctx) { if(visitedNodes.contains(ctx)){ return; } visitedNodes.add(ctx); enterExpr((tinyPythonParser.ExprContext) ctx.getChild(2));//load if(table.contains(ctx.getChild(0).getText())){ this.result+=("istore_"+table.indexOf(ctx.getChild(0).getTex..

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

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 저번 글에서는 ANTLR가 파스트리를 DFS로 접근하며 접근될 때는 enter, 그 노드를 벗어날 때는 exit 함수를 실행한다고 공부했다. 따라서 enter에 구현을 하던, exit에 구현을 하던 결국 우리는 최종적으로 특정 메소드에 해당 노드 방문시 처리 함수를 정의해주어야하는 것 이었다. 그럼 이제 g4 rule을 보고 해당 토큰의 함수에 가서 그에 맞게 구현을 해주면 된다. 우선 IfflowOrder는 If_stmt를 다룰 때 더 자세히 설명하겠지만, Jasmin 상에서 If, elif label 명을 지어주기 위해 만들어둔 인스턴스이다. 본 프로그램에서 If label은 IFLABEL_(IfflowOrder2)(..

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

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 저번 글에서는 전체적으로 Run 버튼을 누르고 나서 어떻게 프로그램이 실행되는지 과정을 살펴보았다. 요약하자면, 프로그램이 실행됨과 동시에 디렉토리 내부의 'Test.tpy'를 찾아와 g4 rule 파일에 정의된 최소 토큰 단위로 문자열을 파싱하는 구조였다. 그래서 우리가 해야할 일은 파싱된 해당 문자열에 도착했을 때 어떤 일을 해줄 것인지를 정의해주는 것이다. 그렇다면 어떻게, 어디서 우리가 해야할 일을 정의할 수 있을까? ANTLR의 기능을 이용하면, 가지고 있는 g4 파일을 기반으로 파싱하기 위한 BaseListener, Visitor, Lexer 등 기본 추상 클래스를 자동 생성이 가능하다. 가지고 있는 g4 파일..

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

* 본 내용은 충남대학교 조은선 교수님의 컴파일러 개론을 수강하고 작성한 글입니다. 이번 학기에 텀프로젝트로 수행한 tinyPython to Jasmin 컴파일러가 나름 재미있게 만든 경험이라고 생각해 정리해보기로 했다. 우선, 전체적인 텀프로젝트 수행 제약 조건은 다음과 같다. 1. Class 정의는 기본적으로 전재한다고 가정 2. 모든 함수는 static 메소드로 가정 3. 함수 정의는 맨 위에서 순서대로 나타남. 그 아래에 main 함수에 해당하는 구문들이 작성 됨 4. 함수 안의 함수 등의 nesting은 없다고 가정. 5. Java Bytecode로 변환 시 Main 함수는 반드시 존재. 생성해줘야함 6. 함수의 인자와 리턴 타입은 int 타입만 7. 사칙 연산 비교 연산은 int만 허용 또한 ..