(1)我得到的文法:............................................................................................................3
(2) 修改后的文法...............................................................................................................4
2、文法图...................................................................................................................................6
3 、P-Code 指令系统.................................................................................................................9
二、详细设计...................................................................................................................................10
1.程序结构.............................................................................................................................10
2.各函数功能描述.................................................................................................................10
3.调用依赖关系.....................................................................................................................12
4.符号表结构.........................................................................................................................13
5.运行栈结构.........................................................................................................................14
三、操作说明...................................................................................................................................14
1.程序安装.............................................................................................................................14
2.操作说明.............................................................................................................................14
四、测试报告...................................................................................................................................15
1.测试程序.............................................................................................................................15
2.测试结果分析.....................................................................................................................17
五、总结感想...................................................................................................................................18
六、参考资料...................................................................................................................................18
一、需求说明
1、文法说明
(1)我得到的文法:
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= <|<=|>|>=|!=|==
<字符> ::= _|a|...|z|A|...|Z
<数字> ::= 0|<非零数字>
<非零数字> ::= 1|...|9
<字符串> ::= "{<合法字符>}" //字符串中可以出现所有合法的可打印字符集中的字符
<程序> ::= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数>
<常量说明部分> ::= const<常量定义>{,<常量定义>};
<常量定义> ::= <标识符>=<整数>
<整数> ::= [+|-]<非零数字>{<数字>}|0
<标识符> ::= <字符>{<字符>|<数字>}
<声明头部> ::= int<标识符>
<变量说明部分> ::= <声明头部>{,<标识符>};
<子函数定义部分> ::= (<声明头部>|void <标识符>)<参数><复合语句>
<复合语句> ::= '{'[<常量说明部分>][<变量说明部分>]<语句序列>'}'
<参数> ::= '('<参数表>')'
<参数表> ::= int<标识符>{,int<标识符>} | <空>
<主函数> ::= void main'('')'<复合语句>
<表达式> ::= [+|-]<项>{<加法运算符><项>}
<项> ::= <因子>{<乘法运算符><因子>}
<因子> ::= <标识符>|'('<表达式>')'|<整数>|<子函数调用语句>
<语句> ::= <条件语句>|<循环语句>|'{'<语句序列>'}'|<子函数调用语句>;
|<赋值语句>; | <返回语句>;|<读语句>;|<写语句>;|;
<赋值语句> ::= <标识符>=<表达式>
<条件语句> ::= if'('<条件>')'<语句>[else<语句>]
<条件> ::= <表达式><关系运算符><表达式>|<表达式>
<循环语句> ::= while'('<条件>')'<语句>
<子函数调用语句> ::= <标识符>'('<值参数表>')'
<值参数表> ::= <表达式>{,<表达式>}|<空>
<语句序列> ::= <语句>{<语句>}
<读语句> ::= scanf'('<标识符>')'
<写语句> ::= printf'('<字符串>,<表达式 >|<字符串>|<表达式 >')'
<返回语句> ::= return [ '('<表达式>')']
(2) 修改后的文法
考虑到原文法中有不明确的地方或不便于处理的地方,我将文法进行了改写,后加的:进
行了扩充,内容有: 支持了 for 循环, 支持 char, 支持 float。
改写后的文法和相应注释如下。
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= <|<=|>|>=|!=|==
<字母> ::= _|a|...|z|A|...|Z //将原文法中的“字符”改为“字母”,意义更为准确
<数字> ::= 0|<非零数字>
<非零数字> ::= 1|...|9
<字符> ::= '<加法运算符>|<乘法运算符>|<字母>|<数字>' //增加一条“字符”的
文法
<字符串> ::= "{<合法字符>}" //字符串中可以出现所有合法的可打印字符集中的字符
<程序> ::= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数> ==子函数
<常量说明部分> ::= const<常量定义>{,<常量定义>}; ==
<常量定义> ::= <标识符>=<整数> ==
<整数> ::= [-]<非零数字>{<数字>}|0 //正常情况下,正数的+号省略。故改写[-]
<标识符> ::= <字母>{<字母>|<数字>} //将“字符”改为“字母”,原因见上文标记
<声明头部> ::= int<标识符>
<变量说明部分> ::= <声明头部>{,<标识符>};
<子函数定义部分> ::= (<声明头部> | void <标识符>)<参数><复合语句>
<复合语句> ::= '{'[<常量说明部分>][<变量说明部分>]<语句序列>'}'
<参数> ::= '('<参数表>')'
<参数表> ::= int<标识符>{,int<标识符>} | <空>
<主函数> ::= void main'('')'<复合语句>
<表达式> ::= [-]<项>{<加法运算符><项>} //去掉+号的情况,原因同上文“整数”处
<项> ::= <因子>{<乘法运算符><因子>}
<因子> ::= <标识符>|'('<表达式>')'|<整数>|<子函数调用语句>
<语句> ::= <条件语句>|<循环语句>|'{'<语句序列>'}'|<子函数调用语句>;
|<赋值语句>; | <返回语句>;|<读语句>;|<写语句>;|<空>;
//添加空语句
<赋值语句> ::= <标识符>=<表达式>
<条件语句> ::= if'('<条件>')'<语句>[else<语句>]
<条件> ::= <表达式><关系运算符><表达式>|<表达式>
<循环语句> ::= while'('<条件>')'<语句> ==no for
<子函数调用语句> ::= <标识符>'('<值参数表>')'
<值参数表> ::= <表达式>{,<表达式>}|<空>
<语句序列> ::= <语句>{<语句>}
<读语句> ::= scanf'('<标识符>')'
<写语句> ::= printf'('<字符串>,<表达式 >|<字符串>|<表达式 >')'
<返回语句> ::= return [ '('<表达式>')']
评论5