본문내용
COMMENT, 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
소개글