计算机科学与技术学院

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机科学与技术学院

系统软件开发实践报告

姓名:王冬升

容易偏重

目录

1借助Flex进行词法分析 (2)

1.1实验内容 (2)

1.2实验要求 (2)

1.3程序代码 (2)

1.4实验结果 (4)

2借助Flex/Bison进行语法分析 (5)

2.1实验内容 (5)

2.2实验要求 (5)

8参考文献……………………………………………………………………

1借助Flex进行词法分析

1.1实验内容

给定C语言的一个子集,具体内容如下:

1.下面是语言的关键字:elseifswitchforintfloatreturnvoidwhile所有的关键字都是保留字,并且必须是小

写。

2.下面是专用符号:

+-*/<<=>>===!==;,()[]{}/**/

3.其他标记是标识符(ID)和数字(NU),通过下列正则表达式定义:

ID=letterletter*

NUM=digitdigit*

letter=a|..|z|A|..|Z

digit=0|..|9

注:小写和大写字母是有区别的。

4.空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关

键字。

(即注

digit[0-9]

id{letter}+

number{digit}+

enter[\n]

spchar("{"|"}"|"["|"]"|"("|")"|";"|"="|","|"+"|"-"|"*"|"/"|"<"|"<="|">"|">="|

"=="|"!=")

comment\/\*(\*[^/]|[^*])*\*\/

kwd(else|if|switch|for|int|float|return|void|while)

%%

{ws}{}

{comment}{}

{enter}{lineno++;}

{kwd}{fprintf(yyout,"%d行\tkeywod\t%s\n",lineno,yytext);}

usingnamespacestd;

intmain(){

inta;

intd=123456;

floatb=123.45;

inte=9;

a=(1+2-1)*4/2;

if(a>b)cout<<"a>b"<

elsecout<<"a<=b"<

cout<

cout<

cout<<"Welcometoc++"<

return0;

} typedefunsignedintuint;

uintxx;

uintyy;

2.4实验步骤

yyparse(void)

#else

int

yyparse();

#endif

#endif

改为

intyyparse()或者intyyparse(void)

4、

yyin=stdin;

5、解析之前,设置yyin为输入文件指针

externFILE*yyin;

if(!(yyin=fopen(filename,"r"))){

printf("thefilenotexist\n");

exit(0);

}

2.5实验结果

avg

Cal.l源码

%{

#include"cal.tab.h"

%}

%optionnoyywrap

integer[0-9]+

dreal([0-9]*"."[0-9]+)

ereal([0-9]*"."[0-9]+[EedD][+-]?[0-9]+)

real{dreal}|{ereal}

nl\n

plus"+"

minus"-"

times"*"

divide"/"

lp"("

rp")"

module"%"

power"^"

%tokenINTEGER

%startlines

%tokenNUMBERNL

%tokenPLUSMINUSTIMESDIVIDEMODULEPOWERLPRP

%typerexpr

%typeiexpr

%leftPLUSMINUS/*leftassociative*/

%leftTIMESDIVIDEMODULE/*leftassociative*/

%leftPOWER

%leftUNARYMINUS

%%

lines:/*nothing*/

|lineslineNL

|lineserrorNL {yyerror();yyerrok;};

line:iexpr {printf("%d\n",$1);}

|rexpr

{printf("%lf\n",$1);};

iexpr:INTEGER

{$$=$2;};

rexpr:REAL

{$$=$1;}

|rexprPLUSrexpr

{$$=$1+$3;}

|rexprMINUSrexpr

{$$=$1-$3;}

|rexprTIMESrexpr

{$$=$1*$3;}

|rexprDIVIDErexpr

相关文档
最新文档