主题:[讨论]各位大神,帮帮小弟,编译考试大作业,马上要交,真的不会了!!!
大家好,我们这个学期的编译原理课程设计要求每个人独立完成一个小型编译器,我自己实在是写不出来,请各位哥哥姐姐帮小弟一个忙啊,感激不尽。
目标:完成编译器及解释执行程序,解释执行程序对编译器产生的PCODE能解释执行,产生运行结
果
文法:C0文法
优化:无
中间代码:无
目标码:PCODE
根据下面的文法及附加说明实现编译器,产生某虚拟计算机的目标代码,并编写解释执行程序,对该目标代码进行解释执行,
输出解释执行结果。
<加法运算符>::= +|-
<乘法运算符>::= * |/
<关系运算符>::= <|<=|>|>=|!=|==
<字符>::= _|a|...|z|A|...|Z
<数字>::= 0|<非零数字>
<非零数字>::= 1|...|9
<字符串> ::= "{<合法字符> }"
//字符串中可以出现所有合法的可打印字符集中的字符
<程序>:= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数>
<常量说明部分>::= const<常量定义>{,<常量定义>};
<常量定义>::= <标识符>=<整数>
<整数>::= [+|-]<非零数字>{<数字>}|0
<标识符>::= <字符>{<字符>|<数字>}
<声明头部>::= int <标识符>
<变量说明部分>::= <声明头部>{,<标识符>};
<子函数定义部分>::= (<声明头部>|void <标识符>)<参数><复合语句>
<复合语句>::= ‘{’[<常量说明部分>][<变量说明部分>]<语句序列>‘}’
<参数>::= ‘(’<参数表>‘)’
<参数表>::= int<标识符>{,int<标识符>} | <空>
<主函数>::= void main‘(’‘)’<复合语句>
<表达式>::= [+|-]<项>{<加法运算符><项>}
<项>::= <因子>{<乘法运算符><因子>}
<因子>::= <标识符>|‘(’<表达式>‘)’|<整数>|<子函数调用语句>
<语句>::= <条件语句>|<循环语句>|‘{’<语句序列>‘}’|<子函数调用语句>;|<赋值语句>; | <返回语句>;|<读语句>;|<写语句>;|;
<赋值语句>::= <标识符>=<表达式>
<条件语句>::= if‘(’<条件>‘)’<语句>[else<语句>]
<条件>::= <表达式><关系运算符><表达式>|<表达式>
<循环语句>::= while‘(’<条件>‘)’<语句>
<子函数调用语句>::= <标识符>‘(’<值参数表>‘)’
<值参数表>::= <表达式>{,<表达式>}|<空>
<语句序列>::= <语句>{<语句>}
<读语句>::= scanf‘(’<标识符>‘)’
<写语句>::= printf‘(’<字符串>,<表达式 >‘)’| printf‘(’<表达式 >‘)’| printf‘(’
<字符串>‘)’
<返回语句>::= return [ ‘(’<表达式>‘)’]
附加说明:(1)返回类型为void的子函数不允许出现在表达式中
(2)子函数的返回类型必须与返回语句匹配,若无返回语句,则子函数必须声明为void类型
(3)标识符不区分大小写字母
(4)写语句中字符串原样输出
目标:完成编译器及解释执行程序,解释执行程序对编译器产生的PCODE能解释执行,产生运行结
果
文法:C0文法
优化:无
中间代码:无
目标码:PCODE
根据下面的文法及附加说明实现编译器,产生某虚拟计算机的目标代码,并编写解释执行程序,对该目标代码进行解释执行,
输出解释执行结果。
<加法运算符>::= +|-
<乘法运算符>::= * |/
<关系运算符>::= <|<=|>|>=|!=|==
<字符>::= _|a|...|z|A|...|Z
<数字>::= 0|<非零数字>
<非零数字>::= 1|...|9
<字符串> ::= "{<合法字符> }"
//字符串中可以出现所有合法的可打印字符集中的字符
<程序>:= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数>
<常量说明部分>::= const<常量定义>{,<常量定义>};
<常量定义>::= <标识符>=<整数>
<整数>::= [+|-]<非零数字>{<数字>}|0
<标识符>::= <字符>{<字符>|<数字>}
<声明头部>::= int <标识符>
<变量说明部分>::= <声明头部>{,<标识符>};
<子函数定义部分>::= (<声明头部>|void <标识符>)<参数><复合语句>
<复合语句>::= ‘{’[<常量说明部分>][<变量说明部分>]<语句序列>‘}’
<参数>::= ‘(’<参数表>‘)’
<参数表>::= int<标识符>{,int<标识符>} | <空>
<主函数>::= void main‘(’‘)’<复合语句>
<表达式>::= [+|-]<项>{<加法运算符><项>}
<项>::= <因子>{<乘法运算符><因子>}
<因子>::= <标识符>|‘(’<表达式>‘)’|<整数>|<子函数调用语句>
<语句>::= <条件语句>|<循环语句>|‘{’<语句序列>‘}’|<子函数调用语句>;|<赋值语句>; | <返回语句>;|<读语句>;|<写语句>;|;
<赋值语句>::= <标识符>=<表达式>
<条件语句>::= if‘(’<条件>‘)’<语句>[else<语句>]
<条件>::= <表达式><关系运算符><表达式>|<表达式>
<循环语句>::= while‘(’<条件>‘)’<语句>
<子函数调用语句>::= <标识符>‘(’<值参数表>‘)’
<值参数表>::= <表达式>{,<表达式>}|<空>
<语句序列>::= <语句>{<语句>}
<读语句>::= scanf‘(’<标识符>‘)’
<写语句>::= printf‘(’<字符串>,<表达式 >‘)’| printf‘(’<表达式 >‘)’| printf‘(’
<字符串>‘)’
<返回语句>::= return [ ‘(’<表达式>‘)’]
附加说明:(1)返回类型为void的子函数不允许出现在表达式中
(2)子函数的返回类型必须与返回语句匹配,若无返回语句,则子函数必须声明为void类型
(3)标识符不区分大小写字母
(4)写语句中字符串原样输出