1 / 10
文档名称:

语法分析实验报告.docx

格式:docx   页数:10页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

语法分析实验报告.docx

上传人:2890135236 2015/3/31 文件大小:0 KB

下载得到文件列表

语法分析实验报告.docx

文档介绍

文档介绍:语法分析实验报告
语法分析功能与目的
语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成作准备。执行语法分析任务的程序叫语法分析程序或语法分析器。
语法分析程序以词法分析输出的符号串作为输入,在分析过程中检查这个符号串是否为该程序语言的句子。如是,则输出该句子的分析数,否则就表示源程序存在语法错误,需要报告错误的性质和位置。
二、TEST语法规则
①<程序>∶∶={<声明序列><语句序列>}
②<声明序列>∶∶=<声明序列><声明语句>|ε
③<声明语句>∶∶=int <标识符>;
④<语句序列>::=<语句序列><语句>|ε
⑤<语句>::=<if语句>|<while语句>|<do语句>|<for语句>
|<read语句>|<write语句>|<复合语句>|<表达式语句>
⑥<if语句>::=if(<表达式>)<语句>[else<语句>]
⑦<while语句>::=while(<表达式>)<表达式>
⑧<for语句>:=for(<表达式>;<表达式>;<表达式>)<语句>
⑨<write语句>::=write<表达式>;
⑩<read语句>::=read<标识符>;
⑴<复合语句>::={<语句序列>}
⑵<表达式语句>:=<表达式>;|;
⑶<表达式>::=<标识符>=<布尔表达式>|<布尔表达式>
⑷<布尔表达式>:=<算术表达式>
|<算术表达式>(>|<|>=|<=|==|!=)<算术表达式>
⑸<算术表达式>::=<项>{(+|-)<项>}
⑹<项>::=<因子>{(*|/)<因子>}
⑺<因子>::=(<表达式>)|<标识符>|<无符号整数>
⑻<do语句>::=do<语句>while(<表达式>);
实验四要求及改进思路
实验要求:
,使该程序能分析:
(1) do语句(有关文法规则参见P77的****题8。)
(2) 同一行中声明多个变量(文法规则参见P77的****题7)。
例如:原先可以分析的变量声明是:
int a;
int b;
现在能分析的变量声明是: int a, b;
改进思路:
对于问题(1),由于do语句的语法规则为
<do语句>::=do<语句>while(<表达式>);
do语句的正确输入形式为:
do {表达式}
while (表达式);
所以do语句的前半部分为一个复合语句,所以在语法分析程序中要能分析出do语句,必须在定义do语句时先要求该句子属于复合语句,然后使指针为while,再到(,然后是表达式,接着就是),最后为;,这就是完整的do语句。
①定义do语句的代码如下:
int do_stat()
{
int es = 0;
fscanf(fp,"%s %s\n",&token,&token1);
printf("%s %s\n",token,token1);
pound_stat(); //调用复合语句
if(es>0) return (es);
if (strcmp(token, "while")) ret