编译原理-语法分析实验

参考

主要还是课堂内容,书本知识

编译原理 —— 递归下降分析法

实验内容

实验指导书就不整个贴了,下面是实验内容

1、对算术表达式文法:

E→TE’

E’→+TE’| -TE’ |ε

T→FT’

T’→*FT’| /FT’ |ε

F→(E) | id |num

构造其递归下降分析程序。

2、实验步骤

(1)求出每个非终结符的FIRST和FOLLOW集(在练习本上求出即可,不要求程序实现);

(2)构造递归下降分析程序;

(3)验证结果。

代码

关于编译原理的知识我也不补充了,刚学我还没搞明白呢

废话不多数直接上代码

package com.year21h1;

import java.util.Scanner;

/**
 * @author: wnhyang
 * @create: 2021-04-16 09:55
 **/
public class Ex2 {
    /**
     * 算术表达式文法
     * E→TE'
     * E'→+TE'| -TE' |ε
     * T→FT'
     * T'→*FT'| /FT' |ε
     * F→(E) | id |num
     */
    static int index = 0;
    static String s;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws Exception {

        Scanner sc = new Scanner(System.in);
        s = sc.next();
        E();
        System.out.println(sb);
    }

    static void E() throws Exception {
        sb.append("E->TE'\t");
        T();
        Ep();
    }

    static void Ep() throws Exception {
        if (!end() && (sym() == '+' || sym() == '-')) {
            sb.append("E'->").append(sym()).append("TE'\t");
            index++;
            T();
            Ep();
        } else {
            sb.append("E'->ε\t");
        }

    }

    static void T() throws Exception {
        sb.append("T->FT'\t");
        F();
        Tp();
    }

    static void Tp() throws Exception {
        if (!end() && (sym() == '*' || sym() == '/')) {
            sb.append("T'->").append(sym()).append("FT'\t");
            index++;
            F();
            Tp();
        } else {
            sb.append("T'->ε\t");
        }

    }

    static void F() throws Exception {
        if (!end()) {
            if (sym() == '(') {
                sb.append("F->(E)\t");
                index++;
                E();
                if (sym() == ')') {

                    index++;
                } else {
                    throw new Exception("error");
                }
            } else if (sym() == 'i') {
                index++;
                if (sym() == 'd') {
                    sb.append("F->id\t");
                    index++;
                } else {
                    throw new Exception("error");
                }
            } else if (sym() == 'n') {
                index++;
                if (sym() == 'u') {
                    index++;
                    if (sym() == 'm') {
                        sb.append("F->num\t");
                        index++;
                    } else {
                        throw new Exception("error");
                    }
                } else {
                    throw new Exception("error");
                }
            } else {
                throw new Exception("error");
            }
        }

    }

    /**
     * 下标合法,当前下标字符,否则异常
     *
     * @return  当前字符
     * @throws Exception
     */
    static char sym() throws Exception {
        if (index >= s.length()) {
            throw new Exception("error");
        }
        return s.charAt(index);
    }

    /**
     * 判断是否到达串尾
     *
     * @return
     */
    static boolean end() {
        return index == s.length();
    }

}

输入:

(id+num)*num/(num-id)

输出:

E->TE’ T->FT’ F->(E) E->TE’ T->FT’ F->id T’->ε E’->+TE’ T->FT’ F->num T’->ε E’->ε T’->*FT’ F->num T’->/FT’ F->(E) E->TE’ T->FT’ F->num T’->ε E’->-TE’ T->FT’ F->id T’->ε E’->ε T’->ε E’->ε

本程序能输出输入串的构造过程(当然必须是合法可构造的),如果递归构造失败则会抛出异常

上面程序只看代码再结合给定的算术表达式就比较容易看懂了,但其实自己动手做不是那么容易,首先要理清其逻辑关系,然后写代码,这时往往总会会忽略一些细节,需要自己调试,直到自己满意

总结

能在繁忙或是说无聊的生活中找到自己喜欢并能投入进去的事实在是太幸福了

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无奈何杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值