编译原理
实验 2 语法分析程序的设计与实现
【实验目的和要求】
设计、编写、调试一个具体的语法分析程序,加深对语法分析原理的理解。
【实验内容】
编译器的实现通常分成几个阶段来完成,本次实验,是为根据给定的文法实现一个小型编译器的语法分析阶
段要完成的任务。请根据给定的文法设计并实现语法分析程序(推荐自顶向下的递归子程序分析方法),基于词
法分析实验所识别出的单词,进一步识别出各类语法成分,输入输出及处理要求如下:
(1)需按文法规则,用递归子程序法对文法中定义的所有种语法成分进行分析;
(2)为了方便进行自动评测,输入的被编译源文件统一命名为 testfile.txt(注意不要写错文件名);输出的结果
文件统一命名为 output.txt(注意不要写错文件名),结果文件中包含如下两种信息:
1)按词法分析识别单词的顺序,按行输出每个单词的信息(要求同词法分析作业,对于预读的情况不能输
出)。
2)在下列高亮显示的语法分析成分分析结束前,另起一行输出当前语法成分的名字,形如“<常量说明>”
(注:未要求输出的语法成分仍需要分析)
[文法定义]:
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= <|<=|>|>=|!=|==
<字母> ::= _|a|...|z|A|...|Z
<数字> ::= 0|<非零数字>
<非零数字> ::= 1|...|9
<字符> ::= '<加法运算符>'|'<乘法运算符>'|'<字母>'|'<数字>'
<字符串> ::= "{十进制编码为 32,33,35-126 的 ASCII 字符}"
<程序> ::= [<常量说明>][<变量说明>]{<有返回值函数定义>|<无返回值函数定义>}<主函
数>
<常量说明> ::= const<常量定义>;{ const<常量定义>;}
<常量定义> ::= int<标识符>=<整数>{,<标识符>=<整数>}
| char<标识符>=<字符>{,<标识符>=<字符>}
<无符号整数> ::= <非零数字>{<数字>}| 0
<整数> ::= [+|-]<无符号整数>
<标识符> ::= <字母>{<字母>|<数字>}
<声明头部> ::= int<标识符> |char<标识符>
<变量说明> ::= <变量定义>;{<变量定义>;}
<变量定义> ::= <类型标识符>(<标识符>|<标识符>'['<无符号整数>']'){,(<标识符>|<标识符>'['
<无符号整数>']' )}
//<无符号整数>表示数组元素的个数,其值需大于 0
<类型标识符> ::= int | char
<有返回值函数定义> ::= <声明头部>'('<参数表>')' '{'<复合语句>'}'
<无返回值函数定义> ::= void<标识符>'('<参数表>')''{'<复合语句>'}'