(四)基於Flex設計實現C子集的詞法分析器

[待完成...]

前期準備

爲了寫出C子集的詞法分析器,首先應該瞭解C子集有哪些。
參考C 基本語法(菜鳥教程)先進行總結:
數字
需要考慮到十進制、十六進制、八進制、二進制、正負數、小數以及科學計數法(應該沒了吧?)
關鍵字:
auto 、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long 、register、return、short、signed、sizeof、static、struct、switch、typedef、unsigned、union、void 、volatile、while。
標識符:
C 標識符是用來標識變量、函數,或任何其他用戶自定義項目的名稱。一個標識符以字母 A-Z 或 a-z 或下劃線 _ 開始,後跟零個或多個字母、下劃線和數字(0-9)。
運算符:
算數運算符:+、-、*、/、%、++、--
關係運算符:==、!=、>、<、>=、<=
邏輯運算符:&&、||、!
位運算符:&、|、^、~、<<、>>
賦值運算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=
雜項運算符我覺得單憑flex無法實現。
標點符號
三種括號:{ } [ ] ( ) 以及 : , ;

flex代碼實現

$ cat C-lexical-analyzer.l 
%{
#include<stdio.h>
%}

letter [a-zA-z_]

/*數字定義*/
number {decimal}|{otcal}|{hexadecimal}|{binary}|{float}|{science}
/*十進制*/
decimal [-+]?(0|[1-9][0-9]*)
/*八進制*/
octal 0[0-7]+
/*十六進制*/
hexadecimal 0[xX][a-fA-F0-9]+
/*二進制*/
binary 0[bB][01]+
/*浮點數*/
float {number}\.[0-9]+
/*科學計數法*/
science {float}[Ee][-+]?[0-9]+

/*標識符定義*/
identifier {letter}({letter}|{digit})*


/*關鍵字*/
AUTO auto 
BREAK break
CASE case
CHAR char
CONST const
CONTINUE continue
DEFAULT default
DO do
DOUBLE double
ELSE else
ENUM enum
EXTERN extern
FLOAT float
FOR for
GOTO goto
IF if
INT int
LONG long 
REGISTER register
RETURN return
SHORT short
SIGNED signed
SIZEOF sizeof
STATIC static
STRUCT struct
SWITCH switch
TYPEDEF typedef
UNSIGNED unsigned
UNION union
VOID void 
VOLATILE volatile
WHILE while

/*其它字符*/
whitespace [ \t\n\r\f\v]+
errno .
 
%%
 
{AUTO} {printf("Key Word:  %s\n",yytext);}
{BREAK} {printf("Key Word:  %s\n",yytext);}
{CASE} {printf("Key Word:  %s\n",yytext);}
{CHAR} {printf("Key Word:  %s\n",yytext);}
{CONST} {printf("Key Word:  %s\n",yytext);}
{CONTINUE} {printf("Key Word:  %s\n",yytext);}
{DEFAULT} {printf("Key Word:  %s\n",yytext);}
{DO} {printf("Key Word:  %s\n",yytext);}
{DOUBLE} {printf("Key Word:  %s\n",yytext);}
{ELSE} {printf("Key Word:  %s\n",yytext);}
{ENUM} {printf("Key Word:  %s\n",yytext);}
{EXTERN} {printf("Key Word:  %s\n",yytext);}
{FLOAT} {printf("Key Word:  %s\n",yytext);}
{FOR} {printf("Key Word:  %s\n",yytext);}
{GOTO} {printf("Key Word:  %s\n",yytext);}
{IF} {printf("Key Word:  %s\n",yytext);}
{INT} {printf("Key Word:  %s\n",yytext);}
{LONG} {printf("Key Word:  %s\n",yytext);}
{REGISTER} {printf("Key Word:  %s\n",yytext);}
{RETURN} {printf("Key Word:  %s\n",yytext);}
{SHORT} {printf("Key Word:  %s\n",yytext);}
{SIGNED} {printf("Key Word:  %s\n",yytext);}
{SIZEOF} {printf("Key Word:  %s\n",yytext);}
{STATIC} {printf("Key Word:  %s\n",yytext);}
{STRUCT} {printf("Key Word:  %s\n",yytext);}
{SWITCH} {printf("Key Word:  %s\n",yytext);}
{TYPEDEF} {printf("Key Word:  %s\n",yytext);}
{UNSIGNED} {printf("Key Word:  %s\n",yytext);}
{UNION} {printf("Key Word:  %s\n",yytext);}
{VOID} {printf("Key Word:  %s\n",yytext);}
{VOLATILE} {printf("Key Word:  %s\n",yytext);}
{WHILE} {printf("Key Word:  %s\n",yytext);}

{number} {printf("Number:  %s\n",yytext);}
{identifier} {printf("ID:  %s\n",yytext);}
{whitespace} {/*跳過空白*/}

{errno} {printf("Mystery character:  %s\n",yytext);}


%%
int main(int argc,char **argv)
{
        yylex();
        return 0;
}
int yywarp(){
        return 1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章