递归下降分析器设计
一、实验/实习过程
内容:利用JavaCC生成一个MiniC的语法分析器;
要求:
1. 用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。 2. 具有错误检查的能力,如果有能力可以输出错误所在的行号,并简单提示
3. 如果输入的源程序符合MiniC的语法规范,输出该程序的层次结构的语法树
具体实施步骤如下:
1.把MiniC转换为文法如下
<程序〉→ main()〈语句块〉
〈语句块〉→{〈语句串〉}
〈语句串〉→〈语句〉〈语句串〉|〈语句〉
〈语句〉→〈赋值语句〉|〈条件语句〉|〈循环语句〉 〈赋值语句〉→ ID =〈表达式〉; 〈条件语句〉→ if〈条件〉〈语句块〉 〈循环语句〉→ while〈条件〉〈语句块〉 〈条件〉→(〈表达式〉〈关系符〉〈表达式〉)
〈表达式〉→〈表达式〉〈运算符〉〈表达式〉|(〈表达式〉)|ID|NUM 〈运算符〉→+|-|*|/
〈关系符〉→<|<=|>|>=|==|!=
2.消除语句中的回溯与左递归
3.在eclipse环境下完成JavaCC的插件安装后,写一个JavaCC文法规范文件(扩
展名为jj)
4.完成的功能包括词法分析,语法分析
二、代码:
options {
JDK_VERSION = \}
PARSER_BEGIN(eg1)
public class eg1 {
public static void main(String args[]) throws ParseException { eg1 parser = new eg1(System.in); parser.start(); } }
PARSER_END(eg1) SKIP : { \| \| \| \}
TOKEN : /* OPERATORS */ {
< PLUS: \| < MINUS: \| < MULTIPLY: \| < DIVIDE: \} TOKEN : { 1 } TOKEN: //关键字 { TOKEN : //定义整型数 { < INTEGER: [\| < #DIGIT: [\} TOKEN : //数字 { TOKEN : //标记 { TOKEN : //标识符 { 2 void start():{} { void block():{} { void string():{} { yuju() (string())? } voidyuju():{} { fuzhiyuju() | tiaojianyuju() | xunhuanyuju() } voidfuzhiyuju():{} { voidtiaojianyuju():{} { voidxunhuanyuju():{} 3 { voidtiaojian():{} { voidbiaodashi():{} { ( void biaodashi2():{} { (yunsuanfu() biaodashi() biaodashi2() )? } voidyunsuanfu():{} { < PLUS > | < MINUS > | < MULTIPLY> |< DIVIDE > } voidguanxifu() :{} { } 4 三、实验/实习总结 本次实习,我使用javacc完成了包括词法分析,语法分析(输出语法树),能够读文件的功能,总的来说比较满意,通过本次实习掌握了javacc基本的使用。 5