5.8 KiB
Lexical Analysis(Scanner) Report
- 주하진, 2024062806
Compilation Environment and Method
주어진 Makefile을 이용하여 C파일을 컴파일함.
C파일은 gcc를 이용해서 컴파일한다.
Makefile에서 산출되는 실행파일은 cminus_cimpl과 cminus_lex가 있으며 각각 main.c util.c scan.c, main.c util.c lex.yy.c를 컴파일한 오브젝트 파일을 필요로 한다.
lex.yy.c는 flex -o lex.yy.c cminus.l을 통해 생성된다.
C-Minus Language
C-Minus에서 필요한 토큰타입변수와 그에 대한 설명은 다음과 같다.
특수 토큰
ENDFILE: 파일끝ERROR: 에러
키워드 토큰
IF:ifTHEN:thenELSE:elseWHILE:whileRETURN:returnINT:intVOID:void
가변길이 토큰
ID: 식별자NUM: 숫자
기호 토큰
ASSIGN:=EQ:==NE:!=LT:<LE:<=GT:>GE:>=PLUS:+MINUS:-TIMES:*OVER:/LPAREN:(RPAREN:)LBRACE:[RBRACE:]LCURLY:{RCURLY:}SEMI:;COMMA:,
토큰에 포함되지 않는 스펙
/*-*/: 주석 (토큰에 포함하지 않음)
위와 같은 토큰 타입을 기반으로 토크나이징하는 것이 목적이다.
Using scan.c
scan.c에서는 올바른 getToken을 작성해야 한다.
getToken을 작성하기에 앞서 전이가능한 STATE를 작성한다. 특히 <, >, !, =, /의 경우에는 단 한 글자만 받는게 아니라 그 다음 문자에 따라 산출할 토큰이 달라질 수 있으므로 그에 따른 STATE를 만든다.
결과적으로 필요한 STATE는 다음과 같다.
START, INOVER, INCOMMENT, ASTERCOMMENT, INASSIGN, INLT, INGT, INNE, INNUM, INID, DONE
이를 이용해 getToken의 DFA를 작성할 수 있다.
stateDiagram-v2
START
state comment {
INOVER
INCOMMENT
ASTERCOMMENT
}
INASSIGN
INLT
INGT
INNE
state multichar {
INNUM
INID
}
state done {
DONE
}
START --> INNUM: isdigit
INNUM --> INNUM: isdigit
INNUM --> DONE: else with unget
START --> INID: isalpha
INID --> INID: isalnum
INID --> DONE: else with unget
START --> INASSIGN: =
INASSIGN --> DONE: =
INASSIGN --> DONE: else with unget
START --> INLT: \<
INLT --> DONE: =
INLT --> DONE: else with unget
START --> INGT: \>
INGT --> DONE: =
INGT --> DONE: else with unget
START --> INNE: !
INNE --> DONE: =
INNE --> DONE: else with unget and</br> return ERROR
START --> INOVER: /
INOVER --> INCOMMENT: \*
INCOMMENT --> ASTERCOMMENT: \*
ASTERCOMMENT --> INCOMMENT: else
ASTERCOMMENT --> START: /
이를 통해 scan.c를 작성하면 된다.
이때 tokenString은 항상 넣되 (하지만 NUM, ID 토큰에서만 필요함) comment때만 안 넣으면 된다. unget할때도 안넣어야 한다.
Using Lex (cminus.l)
tiny의 lex파일처럼 간단하게 넣고 컴파일하면 된다.
하나 중요한 점은 comment를 구현할 때, prev와 now를 각 과정에서 계속 업데이트 해가면서 now == '/' && prev == '*' 일때까지 계속 input()을 받아주면 된다.
Examples & Result
| cminus file | result text file |
|---|---|
|
|
|
|