목차
개요
선행지식
과제수행
-형태소분석기 (Lex)
-구문분석기 (Yacc)
선행지식
과제수행
-형태소분석기 (Lex)
-구문분석기 (Yacc)
본문내용
r ')' .
I55 :
expr : COS '(' expr ')' .
Parsing Table
상태
action
goto
NA
ME
DEC
DEFINE
NUM
BER
-
(
SQ
RT
LOG
EXP
SIN
COS
TAN
.
=
)
-
+
*
/
^
\n
$
stmt_list
stmt
expr
0
s1
s2
s3
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
13
15
14
1
s16
s17
r15
r15
r15
r15
r15
r15
2
r4
3
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
19
4
r14
5
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
20
6
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
21
7
s22
err
8
s23
err
9
s24
err
10
s25
err
11
s26
err
12
s27
err
13
s1
s2
s3
s4
s5
s6
s7
s8
s9
s10
s11
s12
acc
28
14
14
s29
s30
s31
s32
s33
r6
15
err
s34
16
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
35
17
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
36
18
s7
r15
r15
r15
r15
r15
r15
r15
19
s29
s30
s31
s32
s33
r5
20
r12
21
err
s37
s29
s30
s31
s32
s33
22
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
38
23
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
39
24
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
40
25
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
41
26
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
42
27
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
43
28
err
s44
29
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
45
30
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
46
31
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
47
32
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
48
33
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
49
34
r1
35
s29
s30
s31
s32
s33
r3
36
err
r50
s29
s30
s31
s32
s33
37
r13
38
err
r51
s29
s30
s31
s32
s33
39
err
r52
s29
s30
s31
s32
s33
40
err
r53
s29
s30
s31
s32
s33
41
err
r54
s29
s30
s31
s32
s33
42
err
r55
s29
s30
s31
s32
s33
43
err
r56
s29
s30
s31
s32
s33
44
r2
45
r8
r8
r8
s31
s32
s33
r8
46
r7
r7
r7
s31
s32
s33
r7
47
r9
r9
r9
r9
r9
s33
r9
48
r10
r10
r10
r10
r10
s33
r10
49
r11
50
r16
51
r17
52
r18
53
r19
54
r20
55
r21
56
r22
■ 결 과 화 면
Result
Comp
그림1. Comp를 실행시킨 초기화면
그림2. 변수를 선언한 경우
그림3. 변수의 값을 확인
그림4. 변수에 함수를 사용하여 값을 대입한 경우
Result
Comp
그림5. 선언하지 않은 변수를 사용하는 경우 에러 처리
그림6. 상수를 정의 한 경우 (PI=3.14)
그림7. 상수를 재정의 하는 경우 에러 메시지가 출력된다.
그림8. 변수에 함수를 사용하여 값을 대입한 경우
그림9. 함수와 여러 가지 수식의 계산
print('+')
● 후기
Lex와 Yacc. 태어나서 처음 본 프로그램이다. 이 프로그램들을 이용하여 사칙연산을 수행하는 프로그램을 제작하라는 과제가 나왔을 때 나는 눈앞이 캄캄했다. Lex와 Yacc의 문법을 전혀 몰랐을 뿐 아니라 강의내용도 겨우 따라가고 있는 내게는 정말 큰 벽이었다. 주말을 꼬박 투자할 생각으로 우선 도서관에서 책을 빌렸다. 그리고 단단히 각오를 하고 책을 펼쳐보았다. 하지만 예상과는 달리 수업시간에 배운 CFG와 비슷한 문법, 그리고 간단한 구조는 내 마음을 훨씬 편하게 해 주었다. 큰 어려움 없이 프로그램을 짰고 나는 예상한 결과를 얻을 수 있었다. 하지만 Yacc에서 컴파일 시 -ly옵션을 줘야 하는데 bison라이브러리가 설치되어 있지 않아 애를먹었다. 겨우 bison라이브러리를 업데이트 하고 다시 컴파일하였다. 컴파일에 성공하고 조금 수정하고를 반복하다보니 어느정도 자신감이 붙어서 추가기능을 넣고 싶었다. 첫 번째로 C언어와 같이 변수를 선언하지 않으면 사용할 수 없도록 하였다. 선언되지 않은 변수를 사용할 경우 에러메시지와 함께 프로그램이 종료되도록 하였다. 또한 상수 기능도 넣어 상수를 정의하면 재정의가 불가능 하도록 하였다. 그리고 if, while등의 예약어는 사용이 불가하도록 수정하였다. 함수도 정의 하였는데 기본적인 math.h에 포함되어 있는 sqrt, exp, log, sin, cos, tan등의 함수를 추가하였다. 마지막으로 단항연산자를 사용하기 위해 수정을 하였지만 더하기 연산자와의 충돌을 일으켰다. 예를들어 a++은 a+3과 충돌을 일으켜 a+3이 인식이 되지 않았다. 이 문제를 해결하기위해 이리 저리 수정해 보았지만 계속 헛물만 켜고 결국 단항연산자는 포기해야했다. 이러한 것들을 제작하면서 Lex와 Yacc를 이용하면 간단한 스크립트 파서 정도는 충분히 만들 수 있을 것 같았다. 1차 과제 때 매우 힘들게 과제를 하여 2차 과제에 대해서도 막연한 두려움을 가지고 있었는데 예상외로 힘들이지 않고 재미있게 과제를 수행한 것 같다. 지금껏 배운 내용들을 직접 활용해보니 더 흥미가 생기고 추상적인 지식들이 좀 더 명확해 지는 것 같다. 좋은 과제를 수행한 것 같다.
I55 :
expr : COS '(' expr ')' .
Parsing Table
상태
action
goto
NA
ME
DEC
DEFINE
NUM
BER
-
(
SQ
RT
LOG
EXP
SIN
COS
TAN
.
=
)
-
+
*
/
^
\n
$
stmt_list
stmt
expr
0
s1
s2
s3
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
13
15
14
1
s16
s17
r15
r15
r15
r15
r15
r15
2
r4
3
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
19
4
r14
5
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
20
6
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
21
7
s22
err
8
s23
err
9
s24
err
10
s25
err
11
s26
err
12
s27
err
13
s1
s2
s3
s4
s5
s6
s7
s8
s9
s10
s11
s12
acc
28
14
14
s29
s30
s31
s32
s33
r6
15
err
s34
16
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
35
17
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
36
18
s7
r15
r15
r15
r15
r15
r15
r15
19
s29
s30
s31
s32
s33
r5
20
r12
21
err
s37
s29
s30
s31
s32
s33
22
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
38
23
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
39
24
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
40
25
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
41
26
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
42
27
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
43
28
err
s44
29
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
45
30
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
46
31
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
47
32
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
48
33
s18
s4
s5
s6
s7
s8
s9
s10
s11
s12
err
49
34
r1
35
s29
s30
s31
s32
s33
r3
36
err
r50
s29
s30
s31
s32
s33
37
r13
38
err
r51
s29
s30
s31
s32
s33
39
err
r52
s29
s30
s31
s32
s33
40
err
r53
s29
s30
s31
s32
s33
41
err
r54
s29
s30
s31
s32
s33
42
err
r55
s29
s30
s31
s32
s33
43
err
r56
s29
s30
s31
s32
s33
44
r2
45
r8
r8
r8
s31
s32
s33
r8
46
r7
r7
r7
s31
s32
s33
r7
47
r9
r9
r9
r9
r9
s33
r9
48
r10
r10
r10
r10
r10
s33
r10
49
r11
50
r16
51
r17
52
r18
53
r19
54
r20
55
r21
56
r22
■ 결 과 화 면
Result
Comp
그림1. Comp를 실행시킨 초기화면
그림2. 변수를 선언한 경우
그림3. 변수의 값을 확인
그림4. 변수에 함수를 사용하여 값을 대입한 경우
Result
Comp
그림5. 선언하지 않은 변수를 사용하는 경우 에러 처리
그림6. 상수를 정의 한 경우 (PI=3.14)
그림7. 상수를 재정의 하는 경우 에러 메시지가 출력된다.
그림8. 변수에 함수를 사용하여 값을 대입한 경우
그림9. 함수와 여러 가지 수식의 계산
print('+')
● 후기
Lex와 Yacc. 태어나서 처음 본 프로그램이다. 이 프로그램들을 이용하여 사칙연산을 수행하는 프로그램을 제작하라는 과제가 나왔을 때 나는 눈앞이 캄캄했다. Lex와 Yacc의 문법을 전혀 몰랐을 뿐 아니라 강의내용도 겨우 따라가고 있는 내게는 정말 큰 벽이었다. 주말을 꼬박 투자할 생각으로 우선 도서관에서 책을 빌렸다. 그리고 단단히 각오를 하고 책을 펼쳐보았다. 하지만 예상과는 달리 수업시간에 배운 CFG와 비슷한 문법, 그리고 간단한 구조는 내 마음을 훨씬 편하게 해 주었다. 큰 어려움 없이 프로그램을 짰고 나는 예상한 결과를 얻을 수 있었다. 하지만 Yacc에서 컴파일 시 -ly옵션을 줘야 하는데 bison라이브러리가 설치되어 있지 않아 애를먹었다. 겨우 bison라이브러리를 업데이트 하고 다시 컴파일하였다. 컴파일에 성공하고 조금 수정하고를 반복하다보니 어느정도 자신감이 붙어서 추가기능을 넣고 싶었다. 첫 번째로 C언어와 같이 변수를 선언하지 않으면 사용할 수 없도록 하였다. 선언되지 않은 변수를 사용할 경우 에러메시지와 함께 프로그램이 종료되도록 하였다. 또한 상수 기능도 넣어 상수를 정의하면 재정의가 불가능 하도록 하였다. 그리고 if, while등의 예약어는 사용이 불가하도록 수정하였다. 함수도 정의 하였는데 기본적인 math.h에 포함되어 있는 sqrt, exp, log, sin, cos, tan등의 함수를 추가하였다. 마지막으로 단항연산자를 사용하기 위해 수정을 하였지만 더하기 연산자와의 충돌을 일으켰다. 예를들어 a++은 a+3과 충돌을 일으켜 a+3이 인식이 되지 않았다. 이 문제를 해결하기위해 이리 저리 수정해 보았지만 계속 헛물만 켜고 결국 단항연산자는 포기해야했다. 이러한 것들을 제작하면서 Lex와 Yacc를 이용하면 간단한 스크립트 파서 정도는 충분히 만들 수 있을 것 같았다. 1차 과제 때 매우 힘들게 과제를 하여 2차 과제에 대해서도 막연한 두려움을 가지고 있었는데 예상외로 힘들이지 않고 재미있게 과제를 수행한 것 같다. 지금껏 배운 내용들을 직접 활용해보니 더 흥미가 생기고 추상적인 지식들이 좀 더 명확해 지는 것 같다. 좋은 과제를 수행한 것 같다.