中小企业示范基地申请报告.

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

5 实验结果与分析

测试文本test.c

int a[10];

int min(int a[],int low,void a

{

int k;int x;int i;

k=low;

while(i

{

a[0]=1;

if(k>0

{

x=1;

}

}

return x;

}

测试结果

成功实现语法分析

6 小结

通过这次实验,我加深了对语法分析的认识,掌握了递归向下分析方法,实现了对词法分析程序所提供的Token序列的语法检查和结构分析。

语法分析程序编写相对于词法分析要困难得多,首先要将BNF化为EBNF,运用递归向下的方法进行编写,构造出语法树,判别语法分析过程中是否出错以及出错位置和错误类型。虽然EBNF转换成代码的过程原理比较简单,但是操作起来比较繁琐。一开始我对TreeNode数据结构也不是很理解,通过阅读书后的tiny语言语法分析源代码,我弄懂了语法树的输出。

附录(源代码)

Main.c

#include "global..= TRUE;

int Error = FALSE;

int main(void

{

TreeNode * syntaxTree;

char pgm[120];*用于存储文件名*

printf("输入文件名:";

scanf("%s",pgm;

if(strchr (pgm, '.' ==NULL

{

strcat(pgm,".c";

}

source = fopen(pgm,"r";

if(source==NULL

{

fprintf(stderr,"File %s not found\n",pgm;

exit(1;

}

listing = stdout;* listing在屏幕上输出 *

fprintf(listing,"\nC COMPILATION: %s\n",pgm; while (getToken(!=ENDFILE

{

;

}

syntaxTree = parse(;

printTree(syntaxTree;

fclose(source;

return 0;

}

Parse..;* *

TreeNode * parse(void;

TreeNode * declaration_list(void;

TreeNode * declaration(void;

TreeNode * params(void;

TreeNode * param_list(TreeNode * k; TreeNode * param(TreeNode * k;

TreeNode * compound_stmt(void;

TreeNode * local_declaration(void;

TreeNode * statement_list(void;

TreeNode * statement(void;

TreeNode * expression_stmt(void;

TreeNode * selection_stmt(void;

TreeNode * iteration_stmt(void;

TreeNode * return_stmt(void;

TreeNode * expression(void;

TreeNode * var(void;

TreeNode * simple_expression(TreeNode * k;

TreeNode * additive_expression(TreeNode * k;

TreeNode * term(TreeNode * k;

TreeNode * factor(TreeNode * k;

TreeNode * call(TreeNode * k;

TreeNode * args(void;

static void syntaxError(char* message

{

fprintf(listing,"\n>>> ";

fprintf(listing,"Syntax error at line %d: %s",lineno,message; Error = TRUE;

}

static void match(TokenType expected

{

if(token == expected

token = getToken(;

else

{

syntaxError("unexpected token -> ";

printToken(token,tokenString;

fprintf(listing," ";

}

}

TreeNode * parse(void

{

TreeNode * t;

token = getToken(;

t = declaration_list(;

if(token!=ENDFILE

{

syntaxError("endfile_error";

}

return t;

}

TreeNode * declaration_list(void

{

TreeNode * t = declaration(;

TreeNode * p =t;

程序以变量声明开始

while((token!=INT&&(token!=VOID&&(token!=ENDFILE {

syntaxError("开始不是类型声明";

token = getToken(;

if(token==ENDFILE

相关文档
最新文档