KR20120107032A - 플렛폼 독립적 소스 코드 번역기 - Google Patents

플렛폼 독립적 소스 코드 번역기 Download PDF

Info

Publication number
KR20120107032A
KR20120107032A KR1020110024180A KR20110024180A KR20120107032A KR 20120107032 A KR20120107032 A KR 20120107032A KR 1020110024180 A KR1020110024180 A KR 1020110024180A KR 20110024180 A KR20110024180 A KR 20110024180A KR 20120107032 A KR20120107032 A KR 20120107032A
Authority
KR
South Korea
Prior art keywords
source code
parser
language
translator
code translator
Prior art date
Application number
KR1020110024180A
Other languages
English (en)
Other versions
KR101743463B1 (ko
Inventor
황선규
Original Assignee
(주)지앤씨인터렉티브
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by (주)지앤씨인터렉티브 filed Critical (주)지앤씨인터렉티브
Priority to KR1020110024180A priority Critical patent/KR101743463B1/ko
Publication of KR20120107032A publication Critical patent/KR20120107032A/ko
Application granted granted Critical
Publication of KR101743463B1 publication Critical patent/KR101743463B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/205Parsing
    • G06F40/211Syntactic parsing, e.g. based on context-free grammar [CFG] or unification grammars
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44589Program code verification, e.g. Java bytecode verification, proof-carrying code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Health & Medical Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

플랫폼 독립적 소스 코드 번역기가 개시된다.
본 발명의 바람직한 일 실시예에 따르면, 플렛폼(platform)에 독립적인 소스 코드 번역기(source code transator)에 있어서, 제 1 언어로 작성된 소스 코드를 수신하고, 상기 제 1 언어로 작성된 소스 코드를 어휘 분석하는 어휘 분석기; 상기 어휘 분석된 소스 코드를 미리 설정된 문법을 사용하여 구문 분석하는 구문 분석기; 및 상기 구문 분석된 소스 코드를 제 2 언어로 번역하는 코드 생성기를 포함하고, 상기 구문 분석기에서 사용되는 문법에서, 상기 코드 생성기가 제 2 언어로 번역하는데 장애가 되는 문법의 사용은 제한되는 것을 특징으로 하는 소스 코드 번역기가 제공된다.

Description

플렛폼 독립적 소스 코드 번역기{SOURCE CODE TRANSLATOR INDEPENDENT TO PLATFORM}
본 발명은 소스 코드(source code) 번역기에 관한 것으로, 보다 상세하게는 C++ 기반으로 설계된 PC 기반 에뮬레이터(emulator)에서 작성된 게임 소스 코드를 자바(Java)로 용이하게 번역할 수 있는 소스 코드 번역기에 관한 것이다.
일반적으로, 어플리케이션(예; 음악 파일, 오디오 파일, 게임 등과 같은 콘텐츠, 문서 작성기 등과 같은 프로그램 등)은 자바(JAVA), 씨(C), 씨샵(C#) 및 C++ 등과 같은 프로그래밍 언어로 작성되어 배포되고 있다. 그리고, 어플리케이션은 그 어플리케이션을 작성하는데 사용된 언어를 위한 플랫폼 상에서 실행된다. 예를 들어, 자바로 작성된 어플리케이션은 자바를 위한 플렛폼 상에서 실행된다.
위와 달리, 어플리케이션을 작성하는데 사용된 언어를 위한 플랫폼이 없는 시스템에서는 어플리케이션을 이루는 소스 코드를 플랫폼이 지원하는 언어로 번역해야 한다. 예를 들어, 씨로 작성된 어플리케이션을 자바를 위한 플랫폼에서 실행시키기 위해서는 씨로 작성된 어플리케이션의 소스 코드를 자바로 번역해야 한다. 소스 코드를 다른 언어로 번역할 때, 소스 코드의 특성에 따른 장애가 발생한다. 이와 같은 장애는 C++ 기반으로 설계된 PC 기반 에뮬레이터(emulator)에서 작성된 게임 소스 코드를 자바로 번역할 때 특히 문제된다. 구체적으로, namespace, template, #define 등으로 이루어지는 pre-compile macro, 및 #define 매크로 상수 등은 자바로의 번역이 매우 어렵다. 또한, namespace, template, #define 등으로 이루어지는 pre-compile macro, 및 #define 매크로 상수 등을 번역하는 과정에서 오류가 발생하면, 어플리케이션 실행시 오류가 발생할 수 있다.
또한, 경우에 따라서는 자바로 변환된 소스 코드의 가독성이 낮아, 어플리케이션의 실행 속도가 저하될 수 있다.
이에, 본 발명은 C++ 기반으로 설계된 PC 기반 에뮬레이터(emulator)에서 작성된 게임 소스 코드를 용이하게 자바로 번역할 수 있는 소스 코드 번역기를 제공하는데 그 목적이 있다. 즉, 본 발명은 플랫폼에 독립적인 소스 코드 번역기를 제공하는데 그 목적이 있다.
또한, 본 발명은 C++ 기반으로 설계된 PC 기반 에뮬레이터(emulator)에서 작성된 게임 소스 코드를 자바로 번역할 때, 자바로 번역된 소스 코드의 가독성을 높일 수 있는 소스 코드 번역기를 제공하는데 그 목적이 있다.
본 발명의 다른 목적들은 이하의 실시예에 대한 설명을 통해 쉽게 이해될 수 있을 것이다.
상기한 바와 같은 목적을 달성하기 위해 본 발명의 일 측면에 의하면 소스 코드 번역기가 개시된다.
본 발명의 바람직한 일 실시예에 따르면, 플렛폼(platform)에 독립적인 소스 코드 번역기(source code transator)에 있어서, 제 1 언어로 작성된 소스 코드를 수신하고, 상기 제 1 언어로 작성된 소스 코드를 어휘 분석하는 어휘 분석기; 상기 어휘 분석된 소스 코드를 미리 설정된 문법을 사용하여 구문 분석하는 구문 분석기; 및 상기 구문 분석된 소스 코드를 제 2 언어로 번역하는 코드 생성기를 포함하고, 상기 구문 분석기에서 사용되는 문법에서, 상기 코드 생성기가 제 2 언어로 번역하는데 장애가 되는 문법의 사용은 제한되는 것을 특징으로 하는 소스 코드 번역기가 제공된다.
여기서, 상기 어휘 분석기 및 구문 분석기는, 컴파일러-컴파일러(compiler-compiler)를 사용해 구현될 수 있다.
그리고, 상기 컴파일러-컴파일러는, JavaCC일 수 있다.
또한, 상기 구문 분석기에서 사용되는 문법에서, templat은 제외될 수 있다.
또한, 상기 구문 분석기에서 사용되는 문법에서, 클래스 상속은 단 한 개에서부터 만 될 수 있다.
또한, 상기 구문 분석기는, 상기 제 1 언어로 작성된 소스 코드가 #define으로 이루어지는 프리-컴파일 매크로(pre-compile macro)의 경우, 매크로만 처리하는 간단한 구문 분석기를 사용하여 상기 프리-컴파일 매크로를 처리하고, 상기 처리된 프리-컴파일 매크로를 사용하여 구문 트리를 생성할 수 있다.
또한, 상기 구문 분석기는, 상기 제 1 언어로 작성된 소스 코드가 #define 매크로 상수의 경우, 스태틱 파이널(static final)로 변환하고, 상기 변환된 스태틱 파이널을 사용하여 구문 트리를 생성할 수 있다.
또한, 상기 구문 분석기는, 상기 제 1 언어로 작성된 소스 코드가 #define 매크로 함수의 경우, 소스 코드를 변경하고, 상기 변경된 #define 매크로 함수에 대한 소스 코드를 사용하여 구문 트리를 생성할 수 있다.
또한, 상기 구문 분석기는, 상기 제 1 언어로 작성된 소스 코드가 #ifdef인 경우, 소스 코드를 변경하고, 상기 변경된 #ifdef에 대한 소스 코드를 사용하여 구문 트리를 생성할 수 있다.
또한, 상기 구문 분석기는, 상기 제 1 언어로 작성된 소스 코드가 #include의 경우, 소스 코드를 변경하고, 상기 변경된 #include에 대한 소스 코드를 사용하여 구문 트리를 생성할 수 있다.
또한, 상기 구문 분석기는, 상기 제 1 언어로 작성된 소스 코드가 #include의 경우, 자바의 임폴트 키워드(import keyword)를 사용하여, 구문 트리를 생성할 수 있다.
또한, 상기 구문 분석기는, 추상 구문 트리를 생성할 수 있다.
또한, 상기 코드 생성기는, 상기 추상 구문 트리에 비지터 클래스(vistor class)를 삽입하는 것에 의해, 상기 추상 구문 트리를 상기 제 2 언어로 번역할 수 있다.
또한, 상기 제 1 언어는, C++일 수 있다.
또한, 상기 제 2 언어는, 자바(JAVA)일 수 있다.
이상에서 설명한 바와 같이, 본 발명에 의한 소스 코드 번역기에 의하면, C++로 작성된 소스 코드를 자바로 변환할 때 구문 분석기에서 사용되는 문법(grammar)을 제한하는 것에 의해, 자바로의 번역이 용이할 수 있다.
또한, 본 발명에 의한 소스 코드 번역기에 의하면, 자바로의 번역시 구문 분석기가 추상 구문 트리(Abstract Syntax Tree, AST)를 생성하고, 코드 생성기가 추상 구문 트리를 비지터(Vistor) 개념을 사용하여 자바로 번역하는 것에 의해, 자바로 작성된 소스 코드의 가독성이 향상될 수 있다.
도 1은 본 발명의 바람직한 일 실시예에 따른 소스 코드 번역기의 구성 화면을 나타낸다.
도 2는 본 발명의 바람직한 일 실시예에 따른 소스 코드 번역기의 기능 블록도를 나타낸다.
본 발명은 다양한 변경을 가할 수 있고 여러 가지 실시예를 가질 수 있는 바, 특정 실시예들을 도면에 예시하고 상세한 설명에 상세하게 설명하고자 한다. 그러나, 이는 본 발명을 특정한 실시 형태에 대해 한정하려는 것이 아니며, 본 발명의 사상 및 기술 범위에 포함되는 모든 변경, 균등물 내지 대체물을 포함하는 것으로 이해되어야 한다.
각 도면을 설명하면서 유사한 참조부호를 유사한 구성요소에 대해 사용하였다. 본 발명을 설명함에 있어서 관련된 공지 기술에 대한 구체적인 설명이 본 발명의 요지를 흐릴 수 있다고 판단되는 경우 그 상세한 설명을 생략한다.
제1, 제2 등의 용어는 다양한 구성 요소들을 설명하는데 사용될 수 있지만, 상기 구성 요소들은 상기 용어들에 의해 한정되어서는 안 된다. 상기 용어들은 하나의 구성요소를 다른 구성요소로부터 구별하는 목적으로만 사용된다.
예를 들어, 본 발명의 권리 범위를 벗어나지 않으면서 제1 구성요소는 제2 구성요소로 명명될 수 있고, 유사하게 제2 구성요소도 제1 구성요소로 명명될 수 있다.
및/또는 이라는 용어는 복수의 관련된 기재된 항목들의 조합 또는 복수의 관련된 기재된 항목들 중의 어느 항목을 포함한다.
어떤 구성요소가 다른 구성요소에 "연결되어" 있다거나 "접속되어" 있다고 언급된 때에는, 그 다른 구성요소에 직접적으로 연결되어 있거나 또는 접속되어 있을 수도 있지만, 중간에 다른 구성요소가 존재할 수도 있다고 이해되어야 할 것이다.
반면에, 어떤 구성요소가 다른 구성요소에 "직접 연결되어" 있다거나 "직접 접속되어" 있다고 언급된 때에는, 중간에 다른 구성요소가 존재하지 않는 것으로 이해되어야 할 것이다.
본 출원에서 사용한 용어는 단지 특정한 실시예를 설명하기 위해 사용된 것으로, 본 발명을 한정하려는 의도가 아니다.
단수의 표현은 문맥상 명백하게 다르게 뜻하지 않는 한, 복수의 표현을 포함한다. 본 출원에서, "포함하다" 또는 "가지다" 등의 용어는 명세서상에 기재된 특징, 숫자, 단계, 동작, 구성요소, 부품 또는 이들을 조합한 것이 존재함을 지정하려는 것이지, 하나 또는 그 이상의 다른 특징들이나 숫자, 단계, 동작, 구성요소, 부품 또는 이들을 조합한 것들의 존재 또는 부가 가능성을 미리 배제하지 않는 것으로 이해되어야 한다.
다르게 정의되지 않는 한, 기술적이거나 과학적인 용어를 포함해서 여기서 사용되는 모든 용어들은 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자에 의해 일반적으로 이해되는 것과 동일한 의미를 가지고 있다.
일반적으로 사용되는 사전에 정의되어 있는 것과 같은 용어들은 관련 기술의 문맥상 가지는 의미와 일치하는 의미를 가지는 것으로 해석되어야 하며, 본 출원에서 명백하게 정의하지 않는 한, 이상적이거나 과도하게 형식적인 의미로 해석되지 않는다.
본 발명은 C++로 작성된 소스 코드를 자바로 번역할 때 구문 분석기에서 사용되는 문법(grammar)을 제한하는 것에 의해, 자바로의 번역을 용이하게 하고자 한다. 다른 언어로의 번역시 번역 오류가 발생되는 문법들을 경험칙에 의해 추출하고, 추출된 문법의 사용을 제한하는 것에 의해 다른 언어로의 번역이 용이할 수 있다. 이때, 문법의 제한은 자바로의 번역이 용이하지 않은 문법의 사용을 배제하는것과 자바로의 번역이 용이하지 않은 문법을 추상 구문 트리 생성 전에 해당 문법 만을 처리하기 위한 간단한 구문 분석기를 사용하여 자바로의 번역이 용이한 문법으로 전환해주는 것을 의미한다.
또한, 본 발명은 자바로의 번역시 구문 분석기가 추상 구문 트리(Abstract Syntax Tree, AST)를 생성하고, 코드 생성기가 추상 구문 트리를 비지터(Vistor) 개념을 사용하여 자바로 번역하는 것에 의해, 자바로 작성된 소스 코드의 가독성을 향상시키고자 한다.
이하, 도 1 및 도 2를 참조하여, 본 발명의 바람직한 일 실시예에 따른 소스 코드 번역기에 대하여 구체적으로 설명한다.
도 1은 본 발명의 바람직한 일 실시예에 따른 소스 코드 번역기의 구성 화면을 나타낸다. 도 2는 본 발명의 바람직한 일 실시예에 따른 소스 코드 번역기의 기능 블록도를 나타낸다.
도 1을 참조하면, 번역기 화면은 소스 코드 트리(project source code tree) 창, 소스 코드(source code) 창, 번역된 소스 코드(translated source code) 창, 및 번역된 소스 코드 트리(translated project source code tree) 창을 포함할 수 있다. 소스 코드 트리 창을 통해, 프로젝트를 구성하는 복수의 소스 코드 라이브러리가 트리 구조로 디스플레이될 수 있다. 사용자가 번역을 원하는 소스 코드 라이브러리를 선택하면, 소스 코드 창을 통해 선택된 라이브러리를 구성하는 소스 코드들이 디스플레이될 수 있다. 디스플레이되는 소스 코드들은 C++ 기반으로 설계된 PC 기반 에뮬레이터(emulator)에서 작성된 게임 소스 코드일 수 있다. 이때, 사용자가 번역 메뉴(미도시)를 선택하면, 자동으로 소스 코드가 번역된다. 번역되는 소스 코드들은 번역된 소스 코드 창에 디스플레이될 수 있다. 번역된 소스 코드 창에 디스플레이되는 소스 코드들은 자바로 작성된 소스 코드일 수 있다. 그리고, 번역이 완료된 라이브러리는 번역된 소스 코드 트리 창에 트리 구조로 디스플레이될 수 있다. 사용자는 번역된 소스 코드 창을 통해 번역이 재대로 이루어 졌는지 여부를 확인할 수 있다. 또한, 소스 코드 번역기는 하단에 위치한 커맨드-라인 콘솔 출력(commend-line console output) 창을 통해, 소스 코드의 어떤 부분에 번역 오류가 있는지를 디스플레이할 수 있다. 번역의 오류가 발생한 경우 사용자는 오류가 발생한 부분을 수동으로 수정할 수 있다. 본 발명의 번역기의 핵심이 되는 번역기 프로그램은 커맨드-라인 상에서 수행되는 콘솔 프로그램(console program)으로, 셀(shell)에 해당하는 번역기에서 번역 메뉴를 선택하면 자동으로 수행되는 구조를 가질 수 있다. 또한, 번역기는 소스 코드 원본과 번역된 소스 코드의 기본적인 어휘 분석(lexical analysis)을 통한 키워드 컬러 마킹과 괄호 마킹, 인텐드 맞추기 등 소스 코드 에디터로서의 기본적인 기능을 갖출 수 있다.
도 2를 참조하면, 소스 코드 번역기는 어휘 분석기(Lexer), 구문 분석기(parser), 코드 생성기(code generator)를 포함할 수 있다. 위와 같은 소스 코드 번역기는 입력이 소스 코드이고 출력 또한 소스 코드인 컴파일러의 일종으로 볼 수 있다. 입력되는 소스 코드는 C++ 기반으로 설계된 PC 기반 에뮬레이터(emulator)에서 작성된 게임 소스 코드일 수 있고, 출력되는 소스 코드는 자바로 작성된 소스 코드일 수 있다. 소스 코드 번역기를 컴파일러의 일종으로 볼 수 있으므로, 도 2의 소스 코드 번역기의 구조를 일반 컴파일러 구조와 대등하게 해석한다. 즉, 이하에서, 소스 코드 번역기를 전단부(front-end) 및 후단부(back-end)로 나누어 검토한다.
- 전단부(front-end)
전단부는 어휘 분석기, 및 구문 분석기를 포함하여 입력 소스 코드를 해석할 수 있다. 어휘 분석기 및 구문 분석기는 대체적으로 컴파일러를 자동으로 만들어주는 툴인 컴파일러-컴파일러를 이용해 만들 수 있다. 바람직하게는, 어휘 분석기와 구문 분석기를 만들기 위한 컴파일러-컴파일러는 JavaCC라는 컴파일러-컴파일러 툴(JavaCC tool kit)일 수 있다. 일반적으로 사용되고 있는 렉스(lex), 야크(yacc)는 윈도우 환경에서는 보통 상용 버전을 판매하고 있고, 또 렉스, 야크의 수많은 버전 중 하나인 플렉스(flex), 비손(bison)은 보통의 커맨드 라인 프롬프트(command line prompt) 환경에서 수행되지 않고 VMWare나 Cygwin 등 리눅스 에뮬레이션을 통해서 수행된다. 이와 달리, JavaCC는 자바 환경에서 실행되는 크로스-플랫폼(Cross-platform) 컴파일러를 만들 수 있으며, 이론적으로 LL(n) parser를 만들 수 있다. 또한 n의 값을 문법 중간에 유동적으로 변경할 수 있다.
JavaCC를 이용해 어휘 분석기, 구문 분석기를 구현하는 경우 구문 분석기는 추상 구문 트리(abstract syntax tree AST)를 생성할 수 있다. 이때, 구문 분석기는 문법 단위마다 한 개의 AST node를 생성하여 트리 구조를 만들어낼 수 있다. 여기서, C++ => Java 번역기를 구현하기 위해 구문 분석기는 C++ 구문 분석기일 수 있다. 앞서 본 바와 같이, C++ => Java 번역기는 번역시 장애가 많이 발생한다. 특히, 특정 문법의 번역시 장애가 많이 발생한다. 따라서, 구문 분석기가 구문을 해석할 때 사용되는 문법을 제한할 수 있다. 제한되는 문법은 C++ => Java 번역시 C++ 문법 중에서 자바로 번역시키는데 방해가 되거나 매우 자유롭기 때문에 다루기 까다로운 문법일 수 있다.
구문 분석기에서 사용되는 컨텍스트-프리 문법(Context-free grammar)을 표로 정리하면 다음 표1과 같다.
<Program> -> <ExternalDeclarationList>
<ExternalDeclarationList> -> <ExternalDeclaration> <ExternalDeclarationList>*
<ExternalDeclaration> -> <ExternalVariableDeclaration> ";"
| <FunctionDeclaration>
| <StructDeclaration> ";"
| <ClassDeclaration> ";"
| <TypedefDeclaration> ";"
<StructDeclaration> -> "struct" <ID>? "{" <ExternalDeclarationList> "}"
<TypedefDeclaration> -> "typedef"(<ClassDeclaration> | <StructDeclaration> | <ID>)<ID> ";"
<ClassDeclaration> -> "class" <ID>(":" ("public" | "protect" | "private") <ID>)?("{" (
"public:"
| "protect:"
| "private:"
| <ExternalDeclaration>*
) "}")? ";"
<ExternalVariableDeclaration> -> <VariableType> <Variable> ("," <Variable>)*
<Variable> -> ("*")* <ID> ("[" <NUM> "]")*
<ID> -> ["a-z", "A-Z"] ("a-z", "A-Z", "0-9", "_")*
<VariableType> -> "static"? "const"? ("char" | "short" | "int" | "long" | "float" | "double" | "bool" | "struct" <ID> | <ID>)
<FunctionDeclaration> -> <VariableType> <ID>"(" <ParameterList> ")"
(";"
| "{" <StatementList> "}")
<ParameterList> -> (<Parameter> ("," <Parameter>)* )?
<StatementList> -> <Statement>*
<Statement> -> "{" <StatementList> "}"
| <ExternalVariableDeclaration> ";"
| <Expression> ";"
| <ForStatement>
| <IfStatement>
| <WhileStatement>
| <DoWhileStatement>
| <SwitchCaseStatement>
| "return" <Expression> ";"
<ForStatement> -> "for""("<Expression>?";"<Expression>?";"<Expression>? ")"<Statement>
<IfStatement> -> "if"
"("<Expression>")" <Statement>("else" <Statement>)?
<WhileStatement> -> "while" "(" <Expression> ")" <Statement>
<DoWhileStatement> -> "do" <Statement> "while" "(" <Expression> ")"
<SwitchCaseStatement> -> "switch" "(" <Expression> ")"
"{" ("case" <Expression> ":" <StatementList>)* "}"
<Expression> -> <Term> "=" <Expression>
| <Term> "*=" <Expression>
| <Term> "/=" <Expression>
| <Term> "%=" <Expression>
| <Term> "+=" <Expression>
| <Term> "-=" <Expression>
| <Term> "<<=" <Expression>
| <Term> ">>=" <Expression>
| <Term> "&=" <Expression>
| <Term> "|=" <Expression>
| <Term> "^=" <Expression>
| <Term>
<Term> -> <CondTerm> "&&" <Term>
| <CondTerm> "||" <Term>
| "!" <CondTerm>
| <CondTerm>
<CondTerm> -> <AddTerm> "==" <CondTerm>
| <AddTerm> "!=" <CondTerm>
| <AddTerm> ">=" <CondTerm>
| <AddTerm> "<=" <CondTerm>
| <AddTerm> ">" <CondTerm>
| <AddTerm> "<" <CondTerm>
| <AddTerm>
<AddTerm> -> <MultTerm> "+" <AddTerm>
| <MultTerm> "-" <AddTerm>
| <MultTerm>
<MultTerm> -> <UnaryTerm> "*" <MultTerm>
| <UnaryTerm> "/" <MultTerm>
| <UnaryTerm> "%" <MultTerm>
| <UnaryTerm> "<<" <MultTerm>
| <UnaryTerm> ">>" <MultTerm>
| <UnaryTerm>
<UnaryTerm> -> "-" <AddressTerm>
| "++" <AddressTerm>
| "--" <AddressTerm>
| <AddressTerm>
<AddressTerm> -> "&" <Factor>
| "*" <Factor>
| <Factor>
<Factor> -> <Subfactor> ("." <Factor> | "->" <Factor")?
| <Constant>
| <Parenthesis>
<Parenthesis> -> "(" <Term> ")"
<Subfactor> -> <ID>
( "[" <Term> "]"
| "(" <ArgumentList> ")" )?
| "this"
<ArgumentList> -> (<Expression> ("," <Expression>)*)?
그리고, 구문 분석기에서 사용이 제한되는 문법은 하기와 같다.
먼저, templat은 구문 분석기가 사용하는 문법에서 제외될 수 있다.
그리고, 구문 분석기가 사용하는 문법에서 클래스 상속은 단 한 개에서부터 만 될 수 있다. 이는 자바의 제약 사항이다.
또한, 구문 분석기가 추상 구문 트리를 생성할 때, #define 등으로 이루어지는 pre-compile macro의 경우, 먼저 매크로만 처리하는 간단한 구문 분석기가 추가될 수 있다. 그리고, 구문 분석기는 매크로만 처리하는 구문 분석기를 통해 처리된 pre-compile macro를 사용하여 추상 구문 트리를 생성할 수 있다.
또한, 구문 분석기가 추상 구문 트리를 생성할 때, #define 매크로 상수의 경우, 구문 분석기에서 자바의 static final 로 변환할 수 있다. 그리고, 구문 분석기는 static final로 변환된 #define 매크로 상수를 사용하여 추상 구문 트리를 생성할 수 있다.
또한, 구문 분석기를 생성할 때, #define 매크로 함수의 경우, 자바로 바꾸기가 상당히 힘들다. 따라서, 구문 분석기는 #define 매크로 함수의 경우, 원래 pre-compiler가 하는 방식과 동일하게 소스 코드 자체를 바꾼 후 바뀐 #define 매크로 함수를 사용하여 추상 구문 트리를 생성할 수 있다.
또한, 구문 분석기는 #ifdef의 경우, 소스 코드 자체를 바꾼 후 바뀐 소스 코드를 사용하여 추상 구문 트리를 생성할 수 있다.
또한, 구문 분석기는 #include의 경우, 소스 코드 자체를 바꾼 후 바뀐 소스 코드를 사용하여 추상 구문 트리를 생성할 수 있다. 이때, 소스 코드 자체를 바꾸지 않고 Java의 import 키워드를 이용하여 해결할 수도 있다.
구문 분석기의 파싱시 심볼 데이블(Symbol table, 도 2에서 Name Table, Variable)이 사용될 수 있다. 심볼 테이블은 기본적으로 심볼을 저장하는데 사용된다. 여기서, 심볼이란, 변수명, 사용자 정의 변수 타입명 (구조체, 클래스, typedef), 사용자 정의 함수, 스코프 등을 모두 포함할 수 있다. 저장된 심볼은 추후 소스에서 말하는 심볼이 어떤 것을 말하는 것인지 참조하는데 사용된다. 예를 들어, Declaration으로 불려지는 모든 문법 non-terminal 들은 <ID>로 된 터미널이 무슨 용도로 선언 되었는지를 심볼 테이블에 기록하여 두고 파싱시 참조된다. 현재 파싱하는 소스의 위치에 따라 참조할 수 있는 심볼 테이블의 영역이 달라지므로, 심볼 테이블은 기본적으로 트리 구조를 하게 된다. 쉽게 트리 구조를 구성하기 위해 심볼 테이블들을 스택 형태로 구현할 수 있다. 구체적으로, “{” 부호에 따라 스택을 push down하고 "}" 부호에 따라 스택을 pop up 하여 심볼 테이블의 트리 구조를 만들어내고 참조할 수 있다. 심볼 테이블이 구현됨에 따라 <ID> * <ID>와 같은 소스 코드가 모호해지지 않고 올바르게 파싱될 수 있다. 만일 <ID>가 심볼 테이블에 기록되어 있지 않다면, 컴파일 에러가 발생될 수 있다.
- 후단부(back-end) -
후단부는 코드 생성기를 포함하여, 어휘 분석기, 및 구문 분석기를 통해 해석된 코드를 바탕으로 새로운 코드를 생성할 수 있다. 코드 생성기는 Visitor 개념을 사용하여 번역된 코드를 생성할 수 있다. 즉, 후단부는 전단부에서 구문 분석기를 통해 생성된 추상 문법 트리 구조(Abstract Syntax Tree, AST)를 이용한 재귀적 실행 구조를 통해 번역된 코드를 생성할 수 있다.
구체적으로, 문법에 정의된 모든 Non-terminal들에 대하여 각각의 노드에 해당하는 AST Node 클래스가 미리 준비될 수 있다. 여기서, 각 AST Node는 하위 non-terminal 혹은 terminal 들을 프로퍼티(property)로 가지고 있으며, 궁극적으로 AST 노드들은 트리 구조로 연결되게 된다.
AST 노드들은 Accept(Visitor v) 라는 함수를 가지고 있다. 따라서, 코드 생성기는 Accept(Visitor v) 라는 함수에 비지터 클래스 v를 집어넣어 AST 노드가 가지고 하고 싶은 일을 수행할 수 있도록 할 수 있다. 즉, 자바로의 번역시, 구문 분석기가 사용하는 문법에 정의된 모든 Non-terminal들에 대하여 각각의 노드에 해당하는 비지터 클래스가 자바용으로 구비될 수 있다. 그리고, 자바를 위한 플랫폼은 비지터를 사용하여 해당 비지터에 의해 정의되는 소정의 연산을 수행할 수 있다. 여러 개의 언어로 번역을 원하는 경우에는, 언어의 개수만큼의 비지터 클래스를 만들어 구현할 수 있다.
상기한 본 발명의 바람직한 실시예는 예시의 목적을 위해 개시된 것이고, 본 발명에 대해 통상의 지식을 가진 당업자라면 본 발명의 사상과 범위 안에서 다양한 수정, 변경, 부가가 가능할 것이며, 이러한 수정, 변경 및 부가는 하기의 특허청구범위에 속하는 것으로 보아야 할 것이다.

Claims (15)

  1. 플렛폼(platform)에 독립적인 소스 코드 번역기(source code transator)에 있어서,
    제 1 언어로 작성된 소스 코드를 수신하고, 상기 제 1 언어로 작성된 소스 코드를 어휘 분석하는 어휘 분석기;
    상기 어휘 분석된 소스 코드를 미리 설정된 문법을 사용하여 구문 분석하는 구문 분석기; 및
    상기 구문 분석된 소스 코드를 제 2 언어로 번역하는 코드 생성기를 포함하고,
    상기 구문 분석기에서 사용되는 문법에서, 상기 코드 생성기가 제 2 언어로 번역하는데 장애가 되는 문법의 사용은 제한되는 것을 특징으로 하는 소스 코드 번역기.
  2. 제 1 항에 있어서,
    상기 어휘 분석기 및 구문 분석기는,
    컴파일러-컴파일러(compiler-compiler)를 사용해 구현되는 것을 특징으로 하는 소스 코드 번역기.
  3. 제 2 항에 있어서,
    상기 컴파일러-컴파일러는,
    JavaCC인 것을 특징으로 하는 소스 코드 번역기.
  4. 제 1 항에 있어서,
    상기 구문 분석기에서 사용되는 문법에서,
    templat은 제외되는 것을 특징으로 하는 소스 코드 번역기.
  5. 제 1 항에 있어서,
    상기 구문 분석기에서 사용되는 문법에서,
    클래스 상속은 단 한 개에서부터 만 되는 것을 특징으로 하는 소스 코드 번역기.
  6. 제 1 항에 있어서,
    상기 구문 분석기는,
    상기 제 1 언어로 작성된 소스 코드가 #define으로 이루어지는 프리-컴파일 매크로(pre-compile macro)의 경우, 매크로만 처리하는 간단한 구문 분석기를 사용하여 상기 프리-컴파일 매크로를 처리하고, 상기 처리된 프리-컴파일 매크로를 사용하여 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  7. 제 1 항에 있어서,
    상기 구문 분석기는,
    상기 제 1 언어로 작성된 소스 코드가 #define 매크로 상수의 경우, 스태틱 파이널(static final)로 변환하고,
    상기 변환된 스태틱 파이널을 사용하여 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  8. 제 1 항에 있어서,
    상기 구문 분석기는,
    상기 제 1 언어로 작성된 소스 코드가 #define 매크로 함수의 경우, 소스 코드를 변경하고,
    상기 변경된 #define 매크로 함수에 대한 소스 코드를 사용하여 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  9. 제 1 항에 있어서,
    상기 구문 분석기는,
    상기 제 1 언어로 작성된 소스 코드가 #ifdef인 경우, 소스 코드를 변경하고,
    상기 변경된 #ifdef에 대한 소스 코드를 사용하여 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  10. 제 1 항에 있어서,
    상기 구문 분석기는,
    상기 제 1 언어로 작성된 소스 코드가 #include의 경우, 소스 코드를 변경하고,
    상기 변경된 #include에 대한 소스 코드를 사용하여 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  11. 제 1 항에 있어서,
    상기 구문 분석기는,
    상기 제 1 언어로 작성된 소스 코드가 #include의 경우,
    자바의 임폴트 키워드(import keyword)를 사용하여, 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  12. 제 1 항에 있어서,
    상기 구문 분석기는,
    추상 구문 트리를 생성하는 것을 특징으로 하는 소스 코드 번역기.
  13. 제 12 항에 있어서,
    상기 코드 생성기는,
    상기 추상 구문 트리에 비지터 클래스(vistor class)를 삽입하는 것에 의해,
    상기 추상 구문 트리를 상기 제 2 언어로 번역하는 것을 특징으로 하는 소스 코드 번역기.
  14. 제 1 항에 있어서,
    상기 제 1 언어는,
    C++인 것을 특징으로 하는 소스 코드 번역기.
  15. 제 1 항에 있어서,
    상기 제 2 언어는,
    자바(JAVA)인 것을 특징으로 하는 소스 코드 번역기.
KR1020110024180A 2011-03-18 2011-03-18 플렛폼 독립적 소스 코드 번역기 KR101743463B1 (ko)

Priority Applications (1)

Application Number Priority Date Filing Date Title
KR1020110024180A KR101743463B1 (ko) 2011-03-18 2011-03-18 플렛폼 독립적 소스 코드 번역기

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020110024180A KR101743463B1 (ko) 2011-03-18 2011-03-18 플렛폼 독립적 소스 코드 번역기

Publications (2)

Publication Number Publication Date
KR20120107032A true KR20120107032A (ko) 2012-09-28
KR101743463B1 KR101743463B1 (ko) 2017-06-15

Family

ID=47113300

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020110024180A KR101743463B1 (ko) 2011-03-18 2011-03-18 플렛폼 독립적 소스 코드 번역기

Country Status (1)

Country Link
KR (1) KR101743463B1 (ko)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101507469B1 (ko) * 2015-01-06 2015-04-03 (주)싸이버텍 소스 코드 분석 서비스 제공 방법
KR20230040516A (ko) * 2021-09-16 2023-03-23 한국과학기술원 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
CN117193781A (zh) * 2023-08-04 2023-12-08 中国科学院软件研究所 一种面向simscript语言的抽象语法树构建方法和装置

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100454395B1 (ko) * 2004-06-18 2004-10-27 조광현 인터넷을 이용한 모바일 컨텐츠 컨버전방법 및 이를실행하기 위한 프로그램을 기록한 컴퓨터로 읽을 수 있는기록매체
KR100683853B1 (ko) 2005-02-04 2007-02-16 삼성전기주식회사 프리 컴파일링 장치

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101507469B1 (ko) * 2015-01-06 2015-04-03 (주)싸이버텍 소스 코드 분석 서비스 제공 방법
KR20230040516A (ko) * 2021-09-16 2023-03-23 한국과학기술원 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
CN117193781A (zh) * 2023-08-04 2023-12-08 中国科学院软件研究所 一种面向simscript语言的抽象语法树构建方法和装置
CN117193781B (zh) * 2023-08-04 2024-04-30 中国科学院软件研究所 一种面向simscript语言的抽象语法树构建方法和装置

Also Published As

Publication number Publication date
KR101743463B1 (ko) 2017-06-15

Similar Documents

Publication Publication Date Title
Louden Compiler construction
US7293261B1 (en) Language-neutral representation of software code elements
Kats et al. Pure and declarative syntax definition: paradise lost and regained
US8601453B2 (en) COBOL to bytecode translation
US7966170B2 (en) Computer program product and computer system for language-enhanced programming tools
US8516458B2 (en) System representation and handling techniques
US20040194072A1 (en) Multi-language compilation
US20060271920A1 (en) Multilingual compiler system and method
US20020143823A1 (en) Conversion system for translating structured documents into multiple target formats
JP2001209547A (ja) ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置
Angelov et al. PGF: A portable run-time format for type-theoretical grammars
CN113741869B (zh) 一种高性能的可变语法编程语言的构造方法
CN108595334B (zh) 一种计算Java程序动态切片的方法、装置及可读存储介质
KR20010024576A (ko) 기계 기술로부터의 명령군 구조의 시뮬레이터 및 어셈블러생성 방법
KR101743463B1 (ko) 플렛폼 독립적 소스 코드 번역기
US20060009962A1 (en) Code conversion using parse trees
US20040154004A1 (en) Web application code conversion system
US20080141230A1 (en) Scope-Constrained Specification Of Features In A Programming Language
JP2879099B1 (ja) 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置
CN116257245A (zh) 一种基于flex与bison语法分析的多输出编译方法及系统
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
Matsumura et al. A declarative extension of parsing expression grammars for recognizing most programming languages
CN111221519B (zh) 一基于Python的CLI自动化导出方法
Meijer The project on extended affix grammars at Nijmegen
Grigorev et al. String-embedded language support in integrated development environment

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right