编译原理 递归下降子程序的语法分析技术

本文档详细介绍了基于SysY语言的简单算术表达式文法G[E],提供了编译原理中的递归下降分析子程序设计。通过五个以上测试用例,验证了程序能正确判断输入串是否符合文法规则,并能处理错误输入。文章涵盖了词法分析、语法分析表、非终结符号函数定义及主函数的分析流程。
摘要由CSDN通过智能技术生成
  1. 实验目的与内容
    给定SysY语言中简单算术表达式文法G[E]:
    E→TE’
    E’→ATE’|ε
    T→FT’
    T’→MFT’ |ε
    F→(E) | i
    A → + | -
    M → * | /
    根据该文法,编写递归下降分析子程序。
    【说明】
    终结符号i为用户定义的简单变量,即专题1中标识符的定义
    1.输入:是词法分析输出的二元组序列,即任意简单算术表达式经过专题1程序输出后得到的结果。【上述文法中i即对应词法分析的标识符, ±*/分别对应词法分析得到的运算符】
    2.输出:判定输入串是否为该文法定义的合法算术表达式
    3.处理:程序应能发现输入串的错误
    4.设计5个以上的测试用例(尽可能完全,包括正确和出错情况),给出测试结果。
  2. 设计方法
    给出语法分析表:
    在这里插入图片描述

设置ans作为输出字符串,每次分析后加入ans,最后输出至txt
设置index记录当前分析到的字符串位置
flag为错误标识,一旦进入过error()则标记flag.
为每一个非终结符号建立函数进行递归。以E为例,对照分析表建立函数
在主函数中从开始符号进行分析。

  1. 函数定义
    public static String txt2String(File file);//读取文件
    public static void E(char t);//对E的分析
    public static void T(char t);//对T的分析
    public static void Ep(char t);//对E’的分析
    public static void Tp(char t);//对T’的分析
    public static void F(char t);//对F的分析
    public static void A(char t);//对A的分析
    public static void M(char t)//对M的分析
    public static void error()//对error的判断
import java.io.*;
public class Diguixiajiang {
   //递归下降
    static String ans="";
    static int index = 0;			//遍历字符串的当前位置
    static String str="";
    static int flag=0;
    public static String txt2String(File file){
   

               try{
   
                   BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文16
                    String s = null;
                   while((s = br.readLine())!=null){
   //使用readLine方法,一次读一行
                       str = str  +s;
                   }
                   br.close();
               }catch(Exception e){
   
                   e.printStackTrace();
               }

               return str;
           }


    public static void E(char t)
    {
   
        if (t == '(') {
   
            System.out.println("E::TE'");
            ans=ans+"E::TE'\n";
            T(str.charAt(index));
            Ep(str.charAt(index));
        }
        else if (t == 'i') {
   
            System.out.println("E::TE'");
            ans=ans+"E::TE'\n";
            T(str.charAt(index));
            Ep(str.charAt(index));
        }
        else {
   
            error();
            index++;
            E(str.charAt(index));
        
递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 (一)准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值