您好,欢迎来到九壹网。
搜索
您的当前位置:首页递归下降分析器程序(c语言版,编译原理实验)1

递归下降分析器程序(c语言版,编译原理实验)1

来源:九壹网


《编译原理》实验报告

实验二:语法分析程序设计

班级: 姓名: 学号:

08计算计(3)班

斯军浩 E08620325

递归下降分析器设计 [实验目的]:

1. 了解语法分析的主要任务。 2. 熟悉编译程序的编制。

[实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。

[实验要求]:

1. 构造一个小语言的文法,例如,Pascal语言子集的文法(同实验一),考虑其中的算术表达式文法:

G[<表达式>]: G[E]: <表达式>→<表达式>+<项>|<表达式>-<项>|<项> E→E+T|T <项>→<项>*<因式>|<项>/<因式>|<因式> T→T*F|F <因式>→<标识符>|<无符号整数>|(<表达式>) F→i|(E) 2. 设计语法树的输出形式,例如:

产生式 ……

3. 编写递归下降语法分析程序dgxj.c

实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法算术表达式。实验报告中要说明分析使用的方法。 4. 生成并输出分析过程中所用的产生式序列:

1 产生式1 2 产生式2 ……

[实验步骤]:

1. 写出一个小语言的文法,根据情况自由选择C语言或Pascal语言。 2. 写出该小语言的算术表达式等价的LL(1)文法。

G[E]: 其中

E→TG G为E’ G→+TG|∧ ∧为ε T→FS S为T’

S→*FS|∧ F→i|(E)

3. 编写递归下降语法分析程序。 4. 调试运行程序。 5. 结果分析。

6. 撰写实验报告。

实验代码

#include

void E(); void T(); void E1(); void T1(); void F();

char s[100]; int i, SIGN;

int main() { printf(\"请输入一个语句,以#号结束语句(直接输入#号推出)\\n\"); while( 1 ) { SIGN = 0; i=0; scanf(\"%s\ if( s[0] == '#') return 0; E(); if(s[i]=='#') printf(\"正确语句!\\n\"); printf(\"请输入一个语句,以#号结束语句\\n\");

} return 1; }

void E() { if(SIGN==0) { T(); E1(); } }

void E1() { if(SIGN==0) { if(s[i]=='+') { ++i; T(); E1(); } else if(s[i]!='#'&&s[i]!=')') { printf(\"语句有误!\\n\"); SIGN=1; } } }

void T() { if(SIGN==0) { F(); T1(); } }

void T1() { if(SIGN==0) { if(s[i]=='*') { ++i; F(); T1(); } else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+') { printf(\"语句有误!\\n\"); SIGN=1; } } }

void F() { if(SIGN==0) { if(s[i]=='(') { ++i; E(); if(s[i]==')') ++i; else if(s[i]== '#') { printf(\"语句有误!\\n\"); SIGN=1; ++i; } } else if(s[i]=='i') ++i; else

{ printf(\"语句有误!\\n\"); SIGN=1; } } }

测试用例

(1)输入i,预期显示语句正确!

(2)输入iii,预期显示语句有误!

(3)输入a,预期显示语句有误!

(4)输入(i),预期显示语句正确!

(5)输入(a),预期显示语句有误!

(6)输入(i+i),预期显示语句正确!

(7)输入(i+i,预期显示语句有误!

(8)输入((i*i)+i)*i,预期显示语句正确!

(9)输入((((i+i*i)))),预期显示语句正确!

(10)输入(i+ia,预期显示语句有误!

(11)输入i+i*i+i*a,预期显示语句有误!

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务