递归下降语法分析
1. 语法成分说明
<语句块> ::= begin<语句串> end
<语句串> ::= <语句>{;<语句>}
<语句> ::= <赋值语句> | <循环语句> | <条件语句>
<关系运算符> ::= < | <= | >= | > | == | !=
<赋值语句> ::= ID:=<表达式>
<表达式> ::= <项>{+<项> | -<项> }
<项> ::= <因子>{*<因子> | /<因子> }
<因子> ::= ID | NUM | <表达式>
2. 相应的上下文无关文法
*P — > begin S end
S — >A S1 | B S1 | C S1
S1— >S | ε
R — > < | <= | >= | > | == | !=
A — >I:=E;
E— >T E1
E1— >+TE1 | -TE1 | ε
T— >F T1
T1— >FT1 | /FT1 | ε
F — > (E) | I
测试样例
i:=5+i*(i/3-i);
i:=i+i;
end
#
语法分析
public class GrammarAnalysis {
static char[] s = new char[100];
static int sing;
static int i; //用来记录数组s中的下标;
static int error=0;
static void P() {
if(Objects.equals(analyzer.llist.get(i), "begin")) {
++i;
S();
//处理
if(Objects.equals(analyzer.llist.get(i), "end")) {
++i;
}else{
System.out.println("error!--------不是结尾符号end,"+"程序第"+analyzer.map.get(i)+"行出现语法错误");
error++;
++i;
}
}else {
System.out.println("error!--------缺少开头符号begin,"+"程序第"+analyzer.map.get(i)+"行出现语法错误");
error++;
S();
//处理
if(Objects.equals(analyzer.llist.get(i), "end")) {
++i;
}else{
System.out.println("error!--------不是结尾符号end,"+"程序第"+analyzer.map.get(i)+"行出现语法错误");
error++;
++i;
}
}
}
static void S() {
A();
if(Objects.equals(analyzer.llist.get(i), ";")) {
++i;
// if(s[i]!='e') {
S1();
// }
}else {
System.out.println("error!-----------缺少结尾符号;"+",程序第"+analyzer.map.get(i)+"行出现语法错误");
error++;
++i;
S1();
}
}
static void S1() {
if(!Objects.equals(analyzer.llist.get(i), "end")) {
// ++i;
S();
}
}
static void A() {
if(i+1<analyzer.llist.size()&&Objects.equals(analyzer.llist.get(i+1), ":=")) {
++i;
++i;
E();
if(Objects.equals(analyzer.llist.get(i), ")") || Objects.equals(analyzer.llist.get(i), ";")) {
if(Objects.equals(analyzer.llist.get(i), ")"