logo资料库

通过设计、编制、调试一个典型的语法分析程序.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
编译原理实验报告
6 月 15 日 编译原理实验报告 语法分析实验报告 (一)实验目的 通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所 提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 (二)实验要求 ⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法和 LR 分析法 ⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式) 作为分析对象,并且与所选语法分析方法要比较贴切。 (三)实验原理 递归下降分析法是确定的自上而下分析法,这种分析法要求文法是 LL(1) 文法。它的基本思想是,对文法中的每个终结符编写一个函数(或子程序),每 个函数(或子程序)的功能是识别由该非终结符所表示的语法成分。由于描述语 言的文法常常是递归定义的,因此相应的这组函数(或子程序)必然以相互递归 的方式进行调用。 (四)实验步骤 ⑴ 按实习目的和要求,用 C 语言编写一个语法分析程序,同时考虑相应的数据结 构。 ⑵ 调试 调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若 干错例。
⑶ 输出 对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。 ⑷ 扩充 有余力的同学,可适当扩大分析对象。譬如: ① 算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、 函数调用等等。 ② 除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表 达式。③加强语法检查,尽量多和确切地指出各种错误。 (四)语法分析程序的算法思想 主程序示意图如图所示: 调用 scaner 函数读下一格单词符号 调用 S 函数 结束 置初值 (五)程序框架: #include "stdio.h" #include "string.h" char sym; char str[50]; int count = 0;
void S(void); void T(void); void T1(void); void error(void); void Scaner(void); void Scaner(){ sym = str[count++]; } void T1(){ if(sym == ',') { } Scaner(); S(); T1(); else if(sym != ')') error(); } void T(){ S();
T1(); } void S(){ if(sym == 'a'||sym == '^') Scaner(); else if(sym == '(') { Scaner(); T(); if(sym == ')') Scaner(); else error(); } else error(); } void error(){ printf("Error!\n"); } void main(){
char ch; int i = 0; printf("please input the string (以$结束):\n"); scanf("%c,",&ch); while(ch != '$'){ str[i++] = ch; scanf("%c",&ch); } str[i++] = '$'; str[i] = '\0'; Scaner(); S(); if (sym == '$') printf("success!\n"); else printf("Fail!\n"); } 六:实验抓图: 七:实验心得: 通过本次实验,不仅使我编译原理的知识更加巩固,而且可以使理论与实 践相结合,更好的掌握所学知识。我也发现自己的不足之处,以后会多加改正。
分享到:
收藏