[c- Scanner]스캐너(스케너) 소스코드 및 보고서. (lex/flex사용소스 + 직접짠 scanner.c) tiny
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
해당 자료는 10페이지 까지만 미리보기를 제공합니다.
10페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

[c- Scanner]스캐너(스케너) 소스코드 및 보고서. (lex/flex사용소스 + 직접짠 scanner.c) tiny에 대한 보고서 자료입니다.

목차

◉ Project의 목적 및 환경
◉ Code Scanning 과정
-> scanner의 과정에 대한 상세한 설명

◉ Interface of Project 1-A
-> 손으로 직접 coding한 scanner 코드에 대한 설명 및 소스코드
◉ Interface of Project 1-B
-> lex를 이용하여 scanner를 만듬. 소스코드 및 설명
◉ Implementation of Project 1-A (󰋻detail code󰋸)
◉ Implementation of Project 1-B (󰋻detail code󰋸)

◉ Scanner 수행 결과

◉ 과제를 하면서 느낀 점 및 보안할 점

본문내용

반환된 값이 아닌, scanner에 의하여 해석된
// text이다.
return currentToken; // 얻어진 token을 반환한다.
}
Scanner 수행 결과
실행 결과
Test input file
분석
#include
int main(void){
int i;
int
지금 Scanner는 전처리기(#)을 처리
하지 않기 때문에, #include
는 무시되었다.
각각 Reserved words, ETC,
Identifier, Special Symbol로 분류 된
다.
int와 같은 경우, Reseved words로
구분되었고, ‘(’와 같은 기호는 ETC로,
';'는 Special Symbol로 구분되었다.
int_value = 3;
float float_value = 4.0;
double double_value = 5.0;
Scanner에서 ‘=’과 ‘==’는 서로 다른
Token을 반환하지만, 여기서는 둘 다
Special Symbol로 표시 하였다.
이 두 토큰의 구분은 print_token함
수를 통하여 마지막에 정리되어 나타
나게 된다.
“5.0” 같은 경우에는 소수 표현이기 때문에 ‘Float'형으로 분류 되었다.
“3”은 정수이기 때문에 ‘Number'로
분류 되었다.
for(i=0; i< 30; ++i){
Scanner는 ‘+’와 ‘++’을 구분한다.
“for"는 Reserved words로 분류
되었다.
실행 결과
Test input file
분석
printf("This is String\n");
}
if( i <= 3 ){
printf가 identifier로 분류가 된 것은
전처리기를 통하여 include됐을 때,
reserved 형식으로 Token이 반환
되어야 하지만, 이 Scanner는 전처리
과정을 포함하지 않기 때문에 identif
-ier로 분류 되었다.
printf구분의 String은 정상적으로
“String" type으로 분류 되었다.
if(int_value == 4){
double_value = 2.0;
}
}
return
“=”와 “==”가 서로 다른 토큰으로
분류되지만, 현재 출력에서는 동일하 게 Special Symbol로 분류된다.
return은 Reserved words이다.
0;
}
·
별 다른 특이사항은 없다.
○ 총 Token의 Scanning결과와 "testinput.c"-File
Scanning 수행 결과
testinput.c
1: #include
2:
3: int main(void){
4: int i;
5: int int_value = 3;
6: float float_value = 4.0;
7: double double_value = 5.0;
8:
9: for(i=0; i< 30; ++i){
10: printf("This is String\n");
11: }
12:
13: if( i <= 3 ){
14: if(int_value == 4){
15: double_value = 2.0;
16: }
17: }
18:
19:
20: return 0;
21: }
○ 총 Token의 Scanning결과와 comment의 동작 확인을 위한 "testcomment.txt"-File
Scanning 수행 결과
testcomment.txt
1: // Testing : Comment /
2:
3: int i; /* Testing Line Comment
4:
5: ** is it working
6:
7: */
Comment 부분( // or /**/ )에서는 Scanner가 동작을 하지 않는 것을 볼 수 있다.
즉, comment가 나오는 부분은 token으로 인식하지 않고 무시했다는 것이다.
과제를 하면서 느낀 점 및 보안할 점
과제를 하면서 처음에 제일 어려웠던 점은, 각 함수들과의 관계였다. 즉, 어떤 함수가 token을 반환하고, 어디서 그것을 해석하며, 그 인자의 type은 어찌 돼야 하는지가 관건이었다. 나중에서야 enum type으로 token type을 선언하고, enum type을 typecasting해서
사용하였지만, 처음에는 막막하기만 하였다.
과제를 수행하면서 막혔던 부분은 책을 참조하거나, 홈페이지에서 제시 된 tutorial, 웹 문서 등을 참조하였다.
lex를 사용하지 않고서 scanner를 만들 때 가장 어려웠던 것은 state의 이해였다. tiny에서는 총 5~6가지 state를 사용하였는데, 처음 코드를 접한 뒤 state들의 관계를 이해하는 것이 힘들었다.
state를 이해하고, tiny가 아닌 ‘c-'에 맞는 state를 설계하기 위하여 comment state 와 assign state의 모양과 설계를 바꾸었다. 또한 tiny에서는 제공하지 않던 ‘예약어’들도 추가하게 되었다.
lex를 사용할 때 가장 문제가 됐던 부분은 Regular Expression의 올바른 표현법이었다.
가장 애를 먹었던 부분은, 실수를 표현하는 RE와, identifier를 기술하는데 사용된 RE다.
실수의 표현은, number를 부호를 가진 정수로 정의 한 뒤 {number}"."{digit}+ 다음과 같이 표현하였는데, 즉, 부호를 가진 정수가 앞에 온 뒤 소수점이 오고, 부호가 없는 정수인 digit가 반복되는 형식으로 표현하였다.
식별자를 표시하는데 있어서는 ("_"|{letter})|("_"|{letter})({letter}|{digit}|"_")+ 와 같이 길게 표현하였는데, 그 이유는 식별자에서는 숫자가 제일 앞에 올 수 없지만 ‘_’로는 시작할 수 있다는 점이었다.
가장 크게 보안해야 할 점은 소스와 헤더파일의 관리 문제인 것 같다. 학부 과정에 있으면서 큰 project를 안접하다 보니, 거의 모든 전역변수와 함수들을 그냥 "global.h"에 저장해 두고 다른 거의 모든 *.c FILE에서 #include "global.h"와 같이 사용하던 안 좋은 버릇이 생겼다. 코드의 가독성과 캡슐화를 위해서라도, 각 *.c file마다 헤더파일을 생성하고 관리하는 습관을 길러야겠다.

키워드

lex,   c-,   c언어,   c마이너스,   스케너,   스캐너,   scanner,   flex
  • 가격3,000
  • 페이지수35페이지
  • 등록일2010.10.15
  • 저작시기2010.10
  • 파일형식한글(hwp)
  • 자료번호#635192
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니