递归下降语法分析程序

package com.zwh.two;

import java.util.Scanner;

/**
 * 
 * @author zhongwenhao
 *
 *题目:已知文法G: 试编写一个程序, 判断文法G所能接受的串。 
E→TE'
E'→+TE' |ε
T→FT'                         
T'→*FT' |ε
F→(E) | i	
 *
 */

public class CRecursiveDescent {

	public int i; // 此处用于指出要读的字符的位置,相当于语法意义上的单词的位置。
	public char token; // 读出的字符,相当于语法意义上的特殊单词即保留字。
	public Boolean isTrue; // 用于判断串是否为本语法识别。
	public char[] SymbolString = new char[80]; // 用于存放要识别的串即语法单位。

	public CRecursiveDescent(char[] SymbolString) {
		this.SymbolString = SymbolString;
		this.i = 0;
		this.isTrue = true;
		this.token = getToken();

	}

	// 调词法分析程序
	public char getToken() {
		if (i < SymbolString.length) {
			return (SymbolString[i++]);
		}
		return ('\0');
	}

	public void match(char t) {
		if (token == t)
			token = getToken();
		else
			error(); // 出错处理程序
	}

	// 出错处理。
	public void error() {
		isTrue = false;
	}

	public void F() // F→(E) | i
	{
		if (this.token == 'i') {
			match('i');
		} else if (this.token == '(') {
			match('c');
			E();
			match(')');
		} else
			error();

	}

	public void E() // E→TE'
	{
		T();
		E1();
	}

	public void T1() // T'→*FT' |ε
	{
		if (token == '*') {
			match('*');
			F();
			T1();
		} else
			;
	}

	public void E1() // E'→+TE' |ε
	{
		if (token == '+') {
			match('+');
			T();
			E1();
		} else
			;
	}

	public void T() // T→FT'
	{
		F();
		T1();
	}

}

class Test {
	public static void main(String[] args) {

		String symbolstring;
		String ch;

		do {
			System.out.printf("please input symbol string :\n");
			Scanner input = new Scanner(System.in);
			symbolstring = input.next();
//			System.out.println(symbolstring);
			CRecursiveDescent recursion = new CRecursiveDescent(
					symbolstring.toCharArray());

			recursion.E();
			if (recursion.isTrue == false) {
				System.out
						.println("this grammar  not accept the symbol string!");
				System.out
						.println("--------------------------------------------------");
			} else {
				System.out.println("this grammar  accept the symbol string!");
				System.out
						.println("--------------------------------------------------");
			}
			System.out.printf("continue...:[y,n]? ");
			ch = input.next();
			while (!ch.equals("y") && !ch.equals("n"))
				ch = input.next();
		} while (ch.equals("y"));
	}
}



转载于:https://my.oschina.net/zhongwenhao/blog/179201

递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 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、付费专栏及课程。

余额充值