递归下降分析程序 java_递归下降语法分析程序

本文档提供了一个Java程序,用于实现递归下降语法分析,针对特定文法E→TE',T→FT',F→(E) | i进行分析。程序包括获取输入字符、匹配、错误处理和各个非终结符的解析方法。通过用户输入字符串,判断是否符合文法。
摘要由CSDN通过智能技术生成

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"));

}

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值