본문내용
MMENT, T_LINKWORD, T_DATAINFORM, T_ACTIONWORD,
T_FRAMEWORD, T_RIGHTARROW, T_LEFTARROW, T_RLARROW,
T_ADD_MOP, T_SUB_MOP, T_MUL_MOP, T_DIV_MOP, T_GAB_MOP,
T_POW_MOP, T_FT_MOP, T_AND_LOP, T_OR_LOP, T_EQ_LOP,
T_NOT_LOP, T_BIG_LOP, T_LESS_LOP, T_BLKSEPA, T_UNRECOG,
T_DONTCARE, T_EOT };
%}
DIGIT [0-9]
LETTER [_a-zA-Z]
%%
-?{DIGIT}+ return(T_INT);
-?{DIGIT}+"."{DIGIT}+ return(T_FLOAT);
\"[^\"\n]*\" return(T_TEXT);
true|false return(T_BOOL);
"#".* return(T_COMMENT);
using return(T_LINKWORD);
int|float|text|bool return(T_DATAINFORM);
assign|variable|function|eval|compare|call|return return(T_ACTIONWORD);
declare|execute|terminate return(T_FRAMEWORD);
{LETTER}({LETTER}|{DIGIT})* return(T_IDENTIFIER);
"->" return(T_RIGHTARROW);
"<-" return(T_LEFTARROW);
"<->" return(T_RLARROW);
"+" return(T_ADD_MOP);
"-" return(T_SUB_MOP);
"*" return(T_MUL_MOP);
"/" return(T_DIV_MOP);
"%" return(T_GAB_MOP);
"^" return(T_POW_MOP);
"~" return(T_FT_MOP);
"&" return(T_AND_LOP);
"|" return(T_OR_LOP);
"=" return(T_EQ_LOP);
"!" return(T_NOT_LOP);
"<" return(T_BIG_LOP);
">" return(T_LESS_LOP);
"@@" return(T_BLKSEPA);
[\t\n ]+ return(T_DONTCARE);
. return(T_UNRECOG);
%%
int main(int argc, char *argv[])
{
enum token tk;
char explain[24][27] = {
"Comment",
"Link Keyword",
"Data Information keyword",
"Action Keyword",
"Frame Keyword",
"Right Arrow-Operator",
"Left Arrow-Operator",
"Right-Left Arrow-Operator",
"Add Math-Operator",
"Subtract Math-Operator",
"Multiply Math-Operator",
"Divide Math-Operator",
"Remain Math-Operator",
"Square Math-Operator",
"From-To Math-Operator",
"AND Logic-Operator",
"OR Logic-Operator",
"EQUAL Logic-Operator",
"NOT Logic-Operator",
"Bigger-than Logic-Operator",
"Lesser-than Logic-Operator",
"Block Separator",
"Unrecognized Character",
};
argv++;
argc--;
if(argc>0)
yyin = fopen(argv[0],"r");
else
yyin = stdin;
puts("=====================================================");
while( (tk=yylex()) != T_EOF)
{
switch(tk)
{
case T_INT:
printf("%8s\t:\tInteger(%d, %d)\n",yytext,tk,atoi(yytext));
break;
case T_FLOAT:
printf("%8s\t:\tFloat(%d, %f)\n",yytext,tk,atof(yytext));
break;
case T_TEXT:
printf("%8s\t:\tText(%d, %s)\n",yytext,tk,yytext);
break;
case T_BOOL:
printf("%8s\t:\tBool(%d, %s)\n",yytext,tk,yytext);
break;
case T_IDENTIFIER:
printf("%8s\t:\tIdentifier(%d, %s)\n",yytext,tk,yytext);
break;
case T_COMMENT:case T_LINKWORD:case T_DATAINFORM:
case T_ACTIONWORD:case T_FRAMEWORD: case T_RIGHTARROW:
case T_LEFTARROW:case T_RLARROW:case T_ADD_MOP:
case T_SUB_MOP:case T_MUL_MOP:case T_DIV_MOP:case T_GAB_MOP:case T_POW_MOP:case T_FT_MOP:
case T_AND_LOP:case T_OR_LOP:case T_EQ_LOP:case T_NOT_LOP:case T_BIG_LOP:case T_LESS_LOP:
case T_BLKSEPA:case T_UNRECOG:
printf("%8s\t:\t%s(%d, 0)\n",yytext,explain[tk-6],tk);
break;
case T_DONTCARE:
break;
}
}
puts("=====================================================");
return 0;
}
3. 3 실행 결과
2.1 예시를 해당 어휘 분석기를 통해 실행시킨 결과이다.
출력 결과는 2.1 예시 전체에 대한 내용이며. 역할별로 분류된 키워드와 연산자들, 식별자와 주석, 블록 분리자들에 대한 토큰 분리가 이루어지고 있음을 알 수 있다.
T_FRAMEWORD, T_RIGHTARROW, T_LEFTARROW, T_RLARROW,
T_ADD_MOP, T_SUB_MOP, T_MUL_MOP, T_DIV_MOP, T_GAB_MOP,
T_POW_MOP, T_FT_MOP, T_AND_LOP, T_OR_LOP, T_EQ_LOP,
T_NOT_LOP, T_BIG_LOP, T_LESS_LOP, T_BLKSEPA, T_UNRECOG,
T_DONTCARE, T_EOT };
%}
DIGIT [0-9]
LETTER [_a-zA-Z]
%%
-?{DIGIT}+ return(T_INT);
-?{DIGIT}+"."{DIGIT}+ return(T_FLOAT);
\"[^\"\n]*\" return(T_TEXT);
true|false return(T_BOOL);
"#".* return(T_COMMENT);
using return(T_LINKWORD);
int|float|text|bool return(T_DATAINFORM);
assign|variable|function|eval|compare|call|return return(T_ACTIONWORD);
declare|execute|terminate return(T_FRAMEWORD);
{LETTER}({LETTER}|{DIGIT})* return(T_IDENTIFIER);
"->" return(T_RIGHTARROW);
"<-" return(T_LEFTARROW);
"<->" return(T_RLARROW);
"+" return(T_ADD_MOP);
"-" return(T_SUB_MOP);
"*" return(T_MUL_MOP);
"/" return(T_DIV_MOP);
"%" return(T_GAB_MOP);
"^" return(T_POW_MOP);
"~" return(T_FT_MOP);
"&" return(T_AND_LOP);
"|" return(T_OR_LOP);
"=" return(T_EQ_LOP);
"!" return(T_NOT_LOP);
"<" return(T_BIG_LOP);
">" return(T_LESS_LOP);
"@@" return(T_BLKSEPA);
[\t\n ]+ return(T_DONTCARE);
. return(T_UNRECOG);
%%
int main(int argc, char *argv[])
{
enum token tk;
char explain[24][27] = {
"Comment",
"Link Keyword",
"Data Information keyword",
"Action Keyword",
"Frame Keyword",
"Right Arrow-Operator",
"Left Arrow-Operator",
"Right-Left Arrow-Operator",
"Add Math-Operator",
"Subtract Math-Operator",
"Multiply Math-Operator",
"Divide Math-Operator",
"Remain Math-Operator",
"Square Math-Operator",
"From-To Math-Operator",
"AND Logic-Operator",
"OR Logic-Operator",
"EQUAL Logic-Operator",
"NOT Logic-Operator",
"Bigger-than Logic-Operator",
"Lesser-than Logic-Operator",
"Block Separator",
"Unrecognized Character",
};
argv++;
argc--;
if(argc>0)
yyin = fopen(argv[0],"r");
else
yyin = stdin;
puts("=====================================================");
while( (tk=yylex()) != T_EOF)
{
switch(tk)
{
case T_INT:
printf("%8s\t:\tInteger(%d, %d)\n",yytext,tk,atoi(yytext));
break;
case T_FLOAT:
printf("%8s\t:\tFloat(%d, %f)\n",yytext,tk,atof(yytext));
break;
case T_TEXT:
printf("%8s\t:\tText(%d, %s)\n",yytext,tk,yytext);
break;
case T_BOOL:
printf("%8s\t:\tBool(%d, %s)\n",yytext,tk,yytext);
break;
case T_IDENTIFIER:
printf("%8s\t:\tIdentifier(%d, %s)\n",yytext,tk,yytext);
break;
case T_COMMENT:case T_LINKWORD:case T_DATAINFORM:
case T_ACTIONWORD:case T_FRAMEWORD: case T_RIGHTARROW:
case T_LEFTARROW:case T_RLARROW:case T_ADD_MOP:
case T_SUB_MOP:case T_MUL_MOP:case T_DIV_MOP:case T_GAB_MOP:case T_POW_MOP:case T_FT_MOP:
case T_AND_LOP:case T_OR_LOP:case T_EQ_LOP:case T_NOT_LOP:case T_BIG_LOP:case T_LESS_LOP:
case T_BLKSEPA:case T_UNRECOG:
printf("%8s\t:\t%s(%d, 0)\n",yytext,explain[tk-6],tk);
break;
case T_DONTCARE:
break;
}
}
puts("=====================================================");
return 0;
}
3. 3 실행 결과
2.1 예시를 해당 어휘 분석기를 통해 실행시킨 결과이다.
출력 결과는 2.1 예시 전체에 대한 내용이며. 역할별로 분류된 키워드와 연산자들, 식별자와 주석, 블록 분리자들에 대한 토큰 분리가 이루어지고 있음을 알 수 있다.
추천자료
Lex의 정의 및 구성과특징
[우수과제] Lex와 Yacc를 이용한 사칙연산 계산기 제작 (함수, 상수, 변수 사용가능)
컴파일러 Lex 사용법 및 소스
[컴파일러, Compiler] Lex & Yacc 를 이용한 계산기 Report
[컴파일러, Compiler] Lex & Yacc 를 이용한 계산기 Source code
[컴파일러, Compiler] Lex & Yacc 를 이용한 Intermediate code 생성 Report
[컴파일러, Compiler] Lex & Yacc 를 이용한 Parser Report
[컴파일러, Compiler] Lex & Yacc 를 이용한 Intermediate code 생성 Source code
[컴파일러, Compiler] Lex & Yacc 를 이용한 Parser Source code