文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>我的简单的词法分析程序

我的简单的词法分析程序

时间:2007-04-14  来源:rockylinux

用flex生成了一个我的词法分析程序,能够识别我想要的文件,latexlatex而且暂时生成了一种中间的转换格式,这个格式是用来输入到语法分析器中进行语法分析的,语法分析器还没有做,正在学习中。
    工具,flex定义了相应的规则,对正则表达式有仔细的研究了一下,发现原来在词法分析中,如果语言不是很严格的话,定义的东西需要的比较少,下面是我定义的eqs.l文件:
%%
"TITLE"|"SPECIFICATIONS"|"LABELS"|"EQUATIONS"             {out(yytext);out("\n\t");}
"COVARIANCNES"|"PRINT"|"OUTPUT"|"CONSTRAINTS"             {out(yytext);out("\n\t");}
"WTEST"|"VARIANCES"|"INEQUALITY"|"END"                    {out(yytext);out("\n\t");}
"CAES"|"VARIANCES"|"METHOD"|"DATA"                        {out(yytext);}

"MATRIX"|"ANALYSIS"|"GROUPS"|"KAPPA"                      {out(yytext);}
"DELETE"|"MCHAR"|"MISSING"|"FIELDS"                       {out(yytext);}
"FORMAT"|"UNIT"|"CATEGORY"|"WEIGHT"                       {out(yytext);}
"WFORMAT"|"LOOP"|"WT"|"SE"|"OUT"                          {out(yytext);}
"CAMPBELL"|"MULTILEVEL"|"LEVEL"|"XDATA"                   {out(yytext);}
"XVAR"|"VSORT"|"WTN"|"CLUSTER"                            {out(yytext);}

[\t\n]
[ ]+     out(" ");
["/"]    out("\n");
.        out(yytext);
%%

main(argc, argv)
int argc;
char **argv;
{
    ++argv,--argc;
    if(argc > 0)
        yyin = fopen(argv[0], "r");
    else
        yyin = stdin;
    yylex();
    printf("\n");
}

out(char* s)
{
    printf("%s", s);
}
经过编译以后
flex eqs.l
gcc lex.yy.c -o eqs -lfl
生成了一个eqs可执行文件,
测试文件是
/TITLE
Model built by EQS 6 for Windows
/SPECIFICATIONS
DATA='e:\programfiles\eqs61\examples\airpoll.ess'; VARIABLES=7; CAES=60;
METHOD=ML; ANALYSIS=COVARIANCE; MATRIX=RAW;
/LABELS
V1=RAIN; V2=EDUCATN; V3=POP_DEN; V4=NONWHITE; V5=NOX; V6=SO2; V7=MORTALIT;
/EQUATIONS
V1 = 1F1 + E1;        V2 = *F1 + E2;       V3 = *F1 + E3;
V6 = 1F2 + E6;        V7 = *F2 + E7;       F1 = *F2 + D1;
/VARIANCES
F2 = *; E1 = *; E2 = *; E3 = *; E6 = *; E7 = *; D1 = *;
/COVARIANCES
/PRINT
FIT=ALL;            TABLE=EQUATION;
/OUTPUT
Parameters; Standard Errors; RSquare; Codebook; Listing; DATA='EQSOUT.ETS';
/WTEST
PVAL=0.05; PRIORITY=ZERO; NOFIX=(F2, F2), (E3, E3); APRIORI=(E1, E1), (V2, F1);
/CONSTRAINTS
(E1, E1)=(D1, D1);        (E1, E1)=(V7, F2);
/INEQUALITY
0 < (F2, F2) < 0.4;     0 < (E1, E1) < 0.4;     0 < (E2, E2) < 0.4;
/END
输出结果是,结果为了我能够看清楚,用了一定的格式,如果只是作为中间过程传递给语法分析器那么不用这样的格式:
TITLE
        Model built by EQS 6 for Windows
SPECIFICATIONS
        DATA='e:\programfiles\eqs61\examples\airpoll.ess'; VARIABLES=7; CAES=60;METHOD=ML; ANALYSIS=COVARIANCE; MATRIX=RAW;
LABELS
        V1=RAIN; V2=EDUCATN; V3=POP_DEN; V4=NONWHITE; V5=NOX; V6=SO2; V7=MORTALIT;
EQUATIONS
        V1 = 1F1 + E1; V2 = *F1 + E2; V3 = *F1 + E3;V6 = 1F2 + E6; V7 = *F2 + E7; F1 = *F2 + D1;
VARIANCES
        F2 = *; E1 = *; E2 = *; E3 = *; E6 = *; E7 = *; D1 = *;
COVARIANCES

PRINT
        FIT=ALL; TABLE=EQUATION;
OUTPUT
        Parameters; Standard Errors; RSquare; Codebook; Listing; DATA='EQSOUT.ETS';
WTEST
        PVAL=0.05; PRIORITY=ZERO; NOFIX=(F2, F2), (E3, E3); APRIORI=(E1, E1), (V2, F1);
CONSTRAINTS
        (E1, E1)=(D1, D1); (E1, E1)=(V7, F2);
INEQUALITY
        0 < (F2, F2) < 0.4; 0 < (E1, E1) < 0.4; 0 < (E2, E2) < 0.4;
END
上面这些是我的分析程序,发现前人的工作太伟大了,flex工作的原理是三个算法,一个是将正则表达式转换成不确定的有限自动机,然后将不确定的有限自动机确定化,最后在进一步确定并且优化,就生成了相应的词法分析结果。
上学期学的计算理论,现在发现真的很有用。其他语言的第一步也是从这里出发的,如果在这个方向上发展下去,就能写个编译器出来,哈哈,可望不可及阿。
相关阅读 更多 +
排行榜 更多 +
冒险猫下载正版

冒险猫下载正版

休闲益智 下载
画画解谜

画画解谜

休闲益智 下载
忍界对决(最新版本更新)下载

忍界对决(最新版本更新)下载

飞行射击 下载