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