一、实验目的:
设计MiniC的上下文无关文法,利用JavaCC生成调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。
二、语法分析器ducky:
按照MiniC语言的语法规则检查词法分析输出的记号流是否符合这些规则,并根据这些规则所体现出的语言中的各种语法结构的层次性。把规则写入到JavaCC的 .jjt文件中,可以生成树状的层次结构。
三、JavaCC:
在JavaCC的文法规范文件中,不仅可以描述语言的语法规范,而且可以描述词法规范,本次实习中,利用JavaCC以MiniC语言构造一个不含语义分析的编译器前端,包括词法分析、语法分析,并要考虑语法分析中的错误恢复问题。通过使用JavaCC, 可以体会LL(k)文法的编写特点,掌握编写JavaCC文法规范文件的方法。
内容:利用JavaCC生成一个MiniC的语法分析器;
实验代码:
options {
JDK_VERSION = "1.5";
}
初级英语听力PARSER_BEGIN(Parr)
package javacc;
public class Parr {
public static void main(String args[]) throws ParException {
Parr parr = new Parr(System.in);
while (true) {
System.out.print("Enter an expression like this:\n");
System.out.println("void main() or int a; a=4; int b;b=5;if(b>a){...}");
try {
switch (_line()) {
ca 0:
System.out.println("OK.");
break;
ca 1:
System.out.println("stop.");
break;
default:
break;
}
}
韩语发音器
catch(Exception e){
System.out.println("error,will exit");
break;
}
}
}
}
PARSER_END(Parr)
renaissanceSKIP:
{
" " |"\t" |"\r\n" |"\n" |"\r"
}
TOKEN:/*define key words*/
{
<IF:"if"> | <ELSE:"el">| <READ:"read"> | <INT:法航447"int">
|<VOID:"void">|<MAIN:"main">|<WHILE:"while">|<FLOAT:"float">
}
TOKEN:
{
<#DIGIT:["0"-"9"]>
}
TOKEN:/*define integer */
{
<INTEGER:["1"-"9"](<DIGIT>)*>
}
TOKEN:/* difine real number */
{
<REALNUMBER:(<DIGIT>)+
| (<DIGIT>)+"."| (<DIGIT>)+"."(<DIGIT>)+| "."(<DIGIT>)+>
}
TOKEN:/*define mark*/
{
<UNDERSCORE:"_">
| <COMMA:",">| <SEMICOLON:";">| <COLON:":"法文>| <LEFTPARENTHESES:"(">
| <RIGHTPARENTHESES:")"> | <EQUAL:"=">| <PLUS:"+">| <MINUS:"-">
| <TIMES:"*"> | <DIVIDE:"/">|<LEFTBRACE:"{">|<RIGHTBRACE:"}">
}
TOKEN:/* define identifier */
{
<IDENTIFIER:<LETTER>//纯字符串
| <LETTER>(<LETTER>
| <DIGIT>
| <UNDERSCORE>)*(<LETTER>
| <DIGIT>)+>//数字,字符,下划线等组成
| <#LETTER:["a"-"z", "A"-"Z"]>
}
int one_line() : {}
{
procedure()"/"
to make you feel my love
{
return 0;
}
|"/"//分析完成标志
{
return 1;
}
}
void procedure():{}{
(statement())+
}
void statement():{}
{
variableDeclaration()
|identifier()<EQUAL>expression()<SEMICOLON>//赋值语句
|(<IF><LEFTPARENTHESES>condition()<RIGHTPARENTHESES>statement()[<ELSE>statement()])+
|<WHILE><LEFTPARENTHESES>condition()<RIGHTPARENTHESES>statement()
|<VOID><MAIN><LEFTPARENTHESES><RIGHTPARENTHESES>statement()
|<LEFTBRACE>(statement())+<RIGHTBRACE>
}
void identifer():{}
{
<IDENTIFIER>
}
void term():{}{
factor()((<TIMES>
| <DIVIDE>)factor())*
}
void factor():{}
{
identifier()//标识符
|李济勋<LEFTPARENTHESES>expression()<RIGHTPARENTHESES>
|<INTEGER>
|<REALNUMBER>
}
void variableDeclaration():{}{
((<INT>
| <FLOAT>)["[]"])identifier()(<COMMA>identifier())*<SEMICOLON>
|<SEMICOLON>
}
void identifier():{}
{
<IDENTIFIER>
}
void一度教育 condition():{}
{
expression()("=="
|"<>"|"<"|">"|">="|"<="
)expression()
}
void expression():{}
{
term()((<PLUS>|<MINUS>)term())*