当前位置:文档之家› 编译原理实验二

编译原理实验二

实验二语法分析一、实验目的:设计MiniC的上下文无关文法,利用JavaCC生成调试递归下降分析程序,以便对任意输入的符号串进行分析。

本次实验的目的主要是加深对递归下降分析法的理解。

二、语法分析器:按照MiniC语言的语法规则检查词法分析输出的记号流是否符合这些规则,并根据这些规则所体现出的语言中的各种语法结构的层次性。

把规则写入到JavaCC的.jjt文件中,可以生成树状的层次结构。

三、JavaCC:在JavaCC的文法规范文件中,不仅可以描述语言的语法规范,而且可以描述词法规范,本次实习中,利用JavaCC以MiniC语言构造一个不含语义分析的编译器前端,包括词法分析、语法分析,并要考虑语法分析中的错误恢复问题。

通过使用JavaCC, 可以体会LL(k)文法的编写特点,掌握编写JavaCC文法规范文件的方法。

内容:利用JavaCC生成一个MiniC的语法分析器;要求:1.用流的形式读入要分析的C语言程序,或者通过命令行输入源程序。

2.具有错误检查的能力,如果有能力可以输出错误所在的行号,并简单提示3.如果输入的源程序符合MiniC的语法规范,输出该程序的层次结构的语法树本次实习仅完成以下语法范畴的语法分析:1. 写出一个源程序中仅包含if…else, else语句的语法分析。

要求能分析其自身嵌套. 其他语句可简化处理2. 写出一个源程序中仅包含for语句的语法分析。

要求能分析其自身嵌套,其他语句可简化处理3. 写出一个源程序中仅包含while语句的语法分析。

要求能分析其自身嵌套。

其他语句可简化处理4. 写出一个源程序中包含上面的12或者13或者23或者123语句的语法分析。

要求能分析除其自身嵌套外,还包括相互嵌套。

其他语句可简化处理具体实施步骤如下:1.把MiniC转换为文法如下<程序〉→ main()〈语句块〉〈语句块〉→{〈语句串〉}〈语句串〉→〈语句〉;〈语句串〉|〈语句〉;〈语句〉→〈赋值语句〉|〈条件语句〉|〈循环语句〉〈赋值语句〉→ ID =〈表达式〉;〈条件语句〉→ if〈条件〉〈语句块〉〈循环语句〉→ while〈条件〉〈语句块〉〈条件〉→(〈表达式〉〈关系符〉〈表达式〉)〈表达式〉→〈表达式〉〈运算符〉〈表达式〉|(〈表达式〉)|ID|NUM〈运算符〉→+|-|*|/〈关系符〉→<|<=|>|>=|=|!>2.在eclipse环境下完成JavaCC的插件安装后,写一个JavaCC文法规范文件(扩展名为jj)3.完成的功能包括词法分析,语法分析(输出语法树),能够读文件,也能够把输出的结果保存文件中,可以把树的层次结果输出到文件中。

测试文件test.cvoid main(){while(3>4){if(4<=5){X=4}else{X=5}}}运行结果Reading from standard input...Enter c programe only main() with only while();" :eg. voidmian(){while(3<5)};" :Call: startCall: ProcedureConsumed token: <"void" at line 1 column 1>Consumed token: <"main" at line 1 column 6>Consumed token: <"(" at line 1 column 10>Consumed token: <")" at line 1 column 11>Consumed token: <"{" at line 2 column 1>Call: WhileStatementConsumed token: <"while" at line 3 column 9>Consumed token: <"(" at line 3 column 14>Call: ConditionCall: expressionCall: termCall: unaryConsumed token: <<CONSTANT>: "3" at line 3 column 15>Return: unaryReturn: termReturn: expressionConsumed token: <">" at line 3 column 16>Call: expressionCall: termCall: unaryConsumed token: <<CONSTANT>: "4" at line 3 column 17> Return: unaryReturn: termReturn: expressionReturn: ConditionConsumed token: <")" at line 3 column 18>Consumed token: <"{" at line 3 column 19>Call: ifStatementConsumed token: <"if" at line 5 column 11>Consumed token: <"(" at line 5 column 13>Call: ConditionCall: expressionCall: termCall: unaryConsumed token: <<CONSTANT>: "4" at line 5 column 14> Return: unaryReturn: termReturn: expressionConsumed token: <"<=" at line 5 column 15>Call: expressionCall: termCall: unaryConsumed token: <<CONSTANT>: "5" at line 5 column 17> Return: unaryReturn: termReturn: expressionReturn: ConditionConsumed token: <")" at line 5 column 18>Consumed token: <"{" at line 6 column 1>Call: assignConsumed token: <<IDENTIFIER>: "X" at line 6 column 2>Consumed token: <"=" at line 6 column 3>Consumed token: <<CONSTANT>: "4" at line 6 column 4>Return: assignConsumed token: <"}" at line 6 column 5>Consumed token: <"else" at line 7 column 1>Consumed token: <"{" at line 7 column 5>Call: assignConsumed token: <<IDENTIFIER>: "X" at line 7 column 6>Consumed token: <"=" at line 7 column 7>Consumed token: <<CONSTANT>: "5" at line 7 column 8>Return: assignConsumed token: <"}" at line 7 column 9>Return: ifStatementConsumed token: <"}" at line 8 column 9>Return: WhileStatementConsumed token: <"}" at line 9 column 1>Return: ProcedureConsumed token: <<EOF> at line 9 column 3>Return: startOK.实验代码/** JavaCC file*/options {JDK_VERSION = "1.5";DEBUG_PARSER = true;//}PARSER_BEGIN(whileParse)import java.io.FileInputStream;import java.io.FileNotFoundException;public class whileParse {public static void main(String args[]) throws ParseException { // whileParse parser = new whileParse(System.in);FileInputStream fileStream;try {fileStream = new FileInputStream("test.c");whileParse parser = new whileParse(fileStream);System.out.println("Reading from standard input...");System.out.print("Enter c programe only main() with only while();\" :");System.out.print("eg. void mian(){while(3<5)};\" :");try {switch (parser.start()) {case 0:System.out.println("OK.");break;case 1:System.out.println("Goodbye.");break;default:break;}} catch (Exception e) {System.out.println("NOK.");System.out.println(e.getMessage()); parser.ReInit(System.in);} catch (Error e) {System.out.println("Oops.");System.out.println(e.getMessage()); }} catch (FileNotFoundException e1) { // TODO Auto-generated catch blocke1.printStackTrace();}}}PARSER_END(whileParse)SKIP :{" "| "\r"| "\t"| "\n"}TOKEN : /* OPERATORS */{< PLUS:"+" >| < MINUS:"-" >| < MULTIPLY:"*" >| < DIVIDE:"/" >}TOKEN :{< CONSTANT: ( <DIGIT> )+ >| < #DIGIT: ["0" - "9"] >}TOKEN:{<MAIN:"main">| <VOID:"void">| <WHILE:"while">| <ASSIGN:"=">| <IF:"if">| <ELSE:"else">}TOKEN : /* 标识符 */<IDENTIFIER:<LETTER> (<LETTER>|<DIGIT>)* >| <LETTER:["_","a"-"z","A"-"Z"]>}TOKEN:{<GREAT:">">| <LOWER:"<">| <GREATE:">=">| <LOWERW:"<=">}TOKEN:{<LC:"(">| <RC:")">| <LM:"[">| <RM:"]">| <LB:"{">| <RB:"}">}int start() : {}{Procedure() <EOF> { return 0; }| ";" { return 1; }}/*处理主程序*/void Procedure():{}{<VOID><MAIN><LC><RC><LB>WhileStatement()<RB>}void WhileStatement():{}{<WHILE><LC>Condition()<RC><LB> ifStatement() <RB> }void ifStatement():{}{<IF><LC>Condition()<RC><LB>assign()<RB><ELSE><LB>assign()<RB>}void assign():{}{<IDENTIFIER><ASSIGN><CONSTANT>}void expression() : {}term() (( <PLUS> | <MINUS> ) term())*}void term() : {}{unary() (( <MULTIPLY> | <DIVIDE> ) unary())* }void unary() : {}{<CONSTANT>| <LC> expression()<RC>}void Condition():{}{expression()(<LOWER> expression()| <GREAT> expression()| <GREATE> expression()| <LOWERW> expression())}。

相关主题