잡동사니/컴파일러7 [컴파일러 구조와 원리] - SKIP SKIP 프로그래밍 언어의 소스 코드는 공백이나 코멘트처럼 의미가 없는 부분이 존재한다.스캔한 부분을 읽고 바로 바리기 위해서는 아래와 같이 SKIP 명령(SKIP directive)을 사용한다.이때, 토큰은 생성되지 않는다. SKIP: {| | } SKIP 대신 SPECIAL_TOKEN 명령을 사용할 수도 있으며 차이는 토큰을 보존하지 않느냐, 하느냐의 차이이다.SKIP 명령 사용시 스킵한 문자열은 접근할 수 없지만 SPECIAL_TOKEN은 다음 차례의 TOKEN 명령을 통하여 다시 한번 재 접근이 가능하다. 1. 행 코멘트 스킵SPECIAL_TOKEN : {} 문자열 “//”를 만나고, .. 2015. 12. 31. [컴파일러 구조와 원리] - TOKEN TOKEN 식별자와 예약어는 간단하게, TOKEN 명령을 사용하여 스캔할 수 있다. TOKEN: {| | --------------------------| } TOKEN {| | | | | | | | | | | | | | < ELSE : “els.. 2015. 12. 31. [컴파일러 구조와 원리] - 어휘 해석 어휘 해석 JavaCC는 [정규표현(regular expression)] ( 1 ) 기법으로 스캐너를 표현한다. 정규표현식 * JavaCC 는 ‘문자’ .을 ~[] 로 표현한다. * JavaCC 는 ‘부정’을 ^로 쓰지 않고 ~로 표현한다. 1. 고정문자열 - 문자열 그대로 매칭을 위하여 큰따옴표(“”)로 묶어서 표현. - ex. “int” 또는 “char” 2. [시퀀스] ( 2 ) - 고정 문자열의 조합. 고정문자열이 단어라면, 시퀀스는 ‘어절’ - “ABC” “XYZ”처럼, 고정 문자열이 연속되는 것. 이 경우 “ABCXYZ”라고 써도 된다. 3. 문자클래스 - 특정 숫자나, 문자를 명확히 표현할 때, [ ]를 이용하여 사용한다. - [“X”, “Y”, “Z”] 로 표현할 경우, X 또는 Y 또는 .. 2015. 12. 31. [컴파일러 구조와 원리] - 파서 제네레이터 (Parser Generator) 파서 제네레이터 스캐너를 생성하는 프로그램 – 스캐너 제네레이터(scanner generator) 파서를 생성하는 프로그램 – 파서 제네레이터(parser generator) 종류 문법의 취급 범위 속도 LR 파서 제네레이터 넓다 평균적 LALR 파서 제네레이터 비교적 넓다 평균적 LL 파서 제네레이터 약간 좁다 약간 빠르다 JavaCC 예제 options { STATIC = false; } PARSER_BEGIN(Adder) import java.io.*; class Adder { static public void main(String[] args) { for (String arg : args) { try { System.out.println(evaluate(arg)); } catch (ParseExc.. 2015. 12. 31. [컴파일러 구조와 원리] - 구문 해석( lexical analyze ) 구문 해석 수식을 해석할 때는 연산자의 우선순위를 고려해야 되는 것처럼소스코드는 여러 가지 다양한 방법으로 해석되어야 한다. 구문해석 => ( 어휘 해석, 구문 해석 ) 어휘해석(lexical analyze)는 소스 코드를 단어로 분할하는 작업. oter. 스캔(scan)ex) ‘ x = 1 + 2’ ==> ‘x’ ‘=’ ‘1’ ‘+’ ‘2’어휘해석 담당 모듈을 어휘해석기(lexical analyzer) 또는 스캐너(scanner)라고 한다. int main(int argc, char** argv){printf(“Hello, World! \n”); // 인사return 0;}intmain(intargc,char**argv){printf(“Hello, World! \n”);return0;}*어휘해석 단계에.. 2015. 12. 31. [컴파일러 구조와 원리] - 컴파일의 4단계 컴파일의 4단계 1.구문해석 소스코드 해석 -> 파즈(Parse) 또는 구문 해석(Syntax analyzing) 소스코드 해석기 -> 파서(parser) 또는 구문 해석기(syntax analyzer) 컴퓨터가 이해하기 쉬운 형식 -> 구문 트리(syntax tree) ex. x=1, y=2, 3*(x+y) 2. 의미해석 - 로컬 변수 / 글로벌 변수 구별 - 변수 선언 및 참조 구별 - 변수, 식 타입 확인 (형 변환) - 변수 초기화 확인 - 리턴값 유효성 확인 3. 중간표현 생성 - 여러 종류의 언어나 CPU에 대응하는 컴파일러의 경우 중간표현을 가진다. - 리눅스 GCC -> RTL(Register Transfer Language) - 소스코드 해석에서 중간표현까지의 과정을 컴파일러의 프런트-엔.. 2015. 12. 31. [컴파일러 구조와 원리] - 컴파일의 과정 리눅스의 실행파일 – ELF(executable and linking format) 컴파일의 과정 PreProcess - 헤더파일을 가져와 내부 매크로를 전개. Pre(전의) Process(처리) 컴파일 전 처리. - #include , #define 처리 Compile - 어셈블리 언어 (1) (assembly language) 소스코드 출력 - ‘.s’ 확장자 Assemble - 어셈블러(assembler)에 의해 기계어로 변환하는 과정 - 어셈블러의 출력은 오브젝트 파일(Object file) ‘o’ 확장자. Link - 최종 변환 과정. - 라이브러리는 이 단계에서 결합된다. (1) 기계어를 인간이 알기 쉽도록 변환한 텍스트 언어 2015. 12. 31. 이전 1 다음