Skip to content

Latest commit

Β 

History

History
57 lines (42 loc) Β· 2.81 KB

File metadata and controls

57 lines (42 loc) Β· 2.81 KB

TinyPython to JVM Bytecode Compiler

πŸ“Œ 과제 κ°œμš”

이 ν”„λ‘œμ νŠΈλŠ” TinyPython μ½”λ“œλ₯Ό Jasmin λ¬Έλ²•μ˜ Java Bytecode둜 λ³€ν™˜ν•˜λŠ” 컴파일러λ₯Ό, 과제 μš”κ΅¬μ‚¬ν•­μ— 맞좰 κ΅¬ν˜„ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

🎯 과제 λͺ©ν‘œ

  • TinyPython으둜 μž‘μ„±λœ ν”„λ‘œκ·Έλž¨(.tpy)을 Java Bytecode (.j 파일)둜 λ³€ν™˜ν•˜λŠ” 컴파일러 μ œμž‘
  • μƒμ„±λœ .j νŒŒμΌμ€ Jasmin을 μ‚¬μš©ν•΄ .class 파일둜 λ³€ν™˜
  • λ³€ν™˜λœ ν”„λ‘œκ·Έλž¨μ€ java λͺ…λ Ήμ–΄λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•΄μ•Ό 함

πŸ“‚ κ΅¬ν˜„ 파일 μ„€λͺ…

πŸ“ src 디렉토리 ꡬ성

파일λͺ… μ„€λͺ…
Main.java ν”„λ‘œμ νŠΈμ˜ μ§„μž…μ μœΌλ‘œ, ANTLR νŒŒμ„œλ₯Ό μ΄ˆκΈ°ν™”ν•˜κ³  TinyPython μ½”λ“œλ₯Ό Java Bytecode둜 λ³€ν™˜ν•˜λŠ” μ „λ°˜μ μΈ μ‹€ν–‰ 흐름을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
tinyPythonBaseListener.java ANTLR이 μžλ™ μƒμ„±ν•œ 베이슀 λ¦¬μŠ€λ„ˆ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ»€μŠ€ν…€ λ¦¬μŠ€λ„ˆμ—μ„œ ν•„μš”ν•œ λ©”μ„œλ“œλ§Œ μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
tinyPythonLexer.java TinyPython 문법에 κΈ°λ°˜ν•œ λ ‰μ„œ(Lexer)둜, μ†ŒμŠ€ μ½”λ“œλ₯Ό 토큰 λ‹¨μœ„λ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€. ANTLR에 μ˜ν•΄ μžλ™ μƒμ„±λ©λ‹ˆλ‹€.
tinyPythonListener.java ꡬ문 트리λ₯Ό νƒμƒ‰ν•˜λ©° λ™μž‘ν•˜λŠ” λ¦¬μŠ€λ„ˆ μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 직접 κ΅¬ν˜„ν•œ λ¦¬μŠ€λ„ˆ ν΄λž˜μŠ€μ—μ„œ 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜μ—¬ λ‘œμ§μ„ μž‘μ„±ν•©λ‹ˆλ‹€.
tinyPythonParser.java TinyPython 문법을 λ°”νƒ•μœΌλ‘œ μƒμ„±λœ νŒŒμ„œ(Parser) ν΄λž˜μŠ€μž…λ‹ˆλ‹€. ANTLR이 μžλ™ μƒμ„±ν•˜λ©° 문법 뢄석 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
tinyPythonToJasmin.java 핡심 λ³€ν™˜ λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. λ¦¬μŠ€λ„ˆλ₯Ό κ΅¬ν˜„ν•˜μ—¬ TinyPython ꡬ문을 Jasmin(Java Bytecode)으둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

μœ„μ˜ ν΄λž˜μŠ€λ“€ 쀑 Lexer, Parser, BaseListener, ListenerλŠ” ANTLR을 톡해 .g4 νŒŒμΌλ‘œλΆ€ν„° μžλ™ μƒμ„±λœ νŒŒμΌμž…λ‹ˆλ‹€.



πŸ“ 문법 및 μ œμ•½ 쑰건

λ³€κ²½λœ 문법 사항

  • ν•¨μˆ˜ μ •μ˜ 이후 main 문이 μ‹œμž‘λ˜λ„λ‘ ꡬ쑰 λ³€κ²½
  • defs λΌλŠ” non-terminal ν‚€μ›Œλ“œ μΆ”κ°€
  • 비ꡐ μ—°μ‚° ν‘œν˜„μ‹ λ‹¨μˆœν™”: expr (comp_op expr)* β†’ expr comp_op expr

컴파일 μ‹œ μ œμ•½ 쑰건

  1. ν΄λž˜μŠ€λŠ” 기본적으둜 μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •
  2. λͺ¨λ“  ν•¨μˆ˜λŠ” static λ©”μ„œλ“œλ‘œ μž‘μ„±
  3. ν•¨μˆ˜ μ •μ˜λŠ” 파일 상단에 μœ„μΉ˜ν•˜κ³ , 이후 main ν•¨μˆ˜κ°€ μœ„μΉ˜
  4. ν•¨μˆ˜ μ•ˆμ— ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ (nesting κΈˆμ§€)
  5. λ°˜λ“œμ‹œ main ν•¨μˆ˜ 쑴재
  6. λͺ¨λ“  인자 및 리턴 νƒ€μž…μ€ int둜 μ œν•œ
  7. μ—°μ‚°μž(사칙/비ꡐ)도 int만 처리 κ°€λŠ₯
  8. PrintλŠ” λ¬Έμžμ—΄, 숫자 좜λ ₯만 κ°€λŠ₯ν•˜κ³  λ‚΄λΆ€ 연산은 λΆˆκ°€λŠ₯

🚫 κ³ λ €ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” κΈ°λŠ₯

  • λ°°μ—΄
  • μ˜ˆμ™Έ 처리
  • 라이브러리 μ‚¬μš© (Python/Java)
  • 비정상 μž…λ ₯
  • Python νŒ¨ν‚€μ§€/Java νŒ¨ν‚€μ§€ μ‚¬μš©