中小企业示范基地申请报告.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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