编译原理—语法分析器(Java)

递归下降语法分析

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), ")"
  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值