本程序實現英文數字到中文大寫數字的轉換。
主要思想是利用該語法自底向上地構造出1——>999999999999;
然後將數字轉換成中文大寫。
利用flex進行詞法分析,bison進行句法分析。
語法如下:
e1-->one|two|three|four|five|six|seven|eight|nine
e2-->ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen
e3-->twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety
e4-->e3-e1
|e3
|e2
|e1
e51-->e1 hundred and e4
|e1 hundred
e52-->e51
|e4
e61-->e52 thousand e51
|e52 thousand and e4
|e52 thousand
e62-->e61
|e52
e71-->e52 million e61
|e52 million e51
|e52 million and e4
|e52 million
e72-->e71
|e62
e81-->e52 billion e71
|e52 billion e61
|e52 billion e51
|e52 billion and e4
|e52 billion
e82-->e81
|e72
|zero
lex.l文件如下:
%% zero {yylval=0;return ZERO;} one {yylval=1;return NUM1;} two {yylval=2;return NUM1;} three {yylval=3;return NUM1;} four {yylval=4;return NUM1;} five {yylval=5;return NUM1;} six {yylval=6;return NUM1;} seven {yylval=7;return NUM1;} eight {yylval=8;return NUM1;} nine {yylval=9;return NUM1;} ten {yylval=10;return NUM2;} eleven {yylval=11;return NUM2;} twelve {yylval=12;return NUM2;} thirteen {yylval=13;return NUM2;} fourteen {yylval=14;return NUM2;} fifteen {yylval=15;return NUM2;} sixteen {yylval=16;return NUM2;} seventeen {yylval=17;return NUM2;} eighteen {yylval=18;return NUM2;} nineteen {yylval=19;return NUM2;} twenty {yylval=20;return NUM3;} thirty {yylval=30;return NUM3;} forty {yylval=40;return NUM3;} fifty {yylval=50;return NUM3;} sixty {yylval=60;return NUM3;} seventy {yylval=70;return NUM3;} eighty {yylval=80;return NUM3;} ninety {yylval=90;return NUM3;} hundred {return HUNDRED;} thousand {return THOUSAND;} million {return MILLION;} billion {return BILLION;} and {return AND;} [ \t]+ /* skip blanks */ .|\n { return yytext[0];}
%{ #include#include #include using namespace std; void yyerror(string msg); string trans(int term); void dtos(long term,string &result); int yylex(); #define YYSTYPE long %} %token NUM1 %token NUM2 %token NUM3 %token ZERO %token HUNDRED %token THOUSAND %token MILLION %token BILLION %token AND %% lines : lines e82 '\n' {string result;dtos($2,result);cout<
程序的運行:
flex lex.l
bison parser.y
g++ parser.tab.c -ly -ll
./a.out
輸入英文數字回車得到對應的中文大寫。