主要思想是利用该语法自底向上地构造出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];}
parser.y文件如下:
%{
#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
输入英文数字回车得到对应的中文大写。
版权声明:本文为博主原创文章,未经博主允许不得转载。