package org.test;
import org.test.WordAnalyzer;
public class RecursiveDescentAnalyzer {
WordAnalyzer wa = new WordAnalyzer();
boolean isError = false;
public void lrparser() {
if (wa.syn == 1) { //“begin”
wa.scaner();
yujuchuan();
if (wa.syn == 6) { //“end”
wa.scaner();
if (wa.syn == 0 && isError == false) //“end”之后是“#”并且没有出错,则分析成功
System.out.println("语法分析成功!");
} else {
if (isError == false) //之前分析都成功,但没有“end”
System.out.println("语法分析出错!缺少“end”");
isError = true;
}
} else {
System.out.println("语法分析出错!缺少“begin”");
isError = true;
}
}
/*
* 分析语句串
*/
public void yujuchuan() {
statement(); //分析第一条语句
while (wa.syn == 26) {// 为“;”时,分析下一条语句
wa.scaner();
if (wa.syn == 6) break;
statement();
}
}
/*
* 分析语句
*/
public void statement() {
if (wa.syn == 10) { //语句的开始是标识符,读下一个单词符号
wa.scaner();
if (wa.syn == 18) { //为“:=” 赋值时,分析表达式
wa.scaner();
expression();
} else {
System.out.println("语法分析出错!表达式错误");
isError = true;
}
} else {
System.out.println("语法分析出错!语句错误");
isError = true;
}
}
/*
* 分析表达式
*/
public void expression() {
term(); //分析第一项
while (wa.syn == 13 || wa.syn == 14) { // 为“+”或“-”时,分析下一项
wa.scaner();
term();
}
}
/*
* 分析表达式的项
*/
public void term() {
factor(); //分析第一个因子
while (wa.syn == 15 || wa.syn == 16) { //为“*”或“/”时,分析下一个因子
wa.scaner();
factor();
}
}
/*
* 分析项的因子
*/
public void factor() {
if (wa.syn == 10 || wa.syn == 11) //为标识符或整数时,这一项分析结束
wa.scaner();
else if (wa.syn == 27) { //为“(”时,分析“(”里的表达式
wa.scaner();
expression();
if (wa.syn == 28) //表达式分析结束且下一个单词符号为“)”时,这一项分析结束
wa.scaner();
else { //表达式分析结束且下一个单词符号不是“)”,分析出错
System.out.println("语法分析出错!缺少“)”");
isError = true;
}
} else {
System.out.println("语法分析出错!表达式错误");
isError = true;
}
}
public static void main(String[] args) {
RecursiveDescentAnalyzer test = new RecursiveDescentAnalyzer();
System.out.println("********************语法分析程序********************");
test.wa.read();
test.wa.scaner();
test.lrparser();
System.out.println("语法分析结束!");
}
}