0
実行できるプログラムにしてください
import java.io.*;
public class Parser{
void printBNF(){
System.out.println("<A>::= f <B> | g <C>");
System.out.println("<B>::= g <D> | <D> <D>");
System.out.println("<C>::= f <B> | <B>");
System.out.println("<D>::= g <E> | <E>");
System.out.println("<E>::= f | g | ( <A> )");
}
public static void main(String[] args)throws Exception{
BufferedReader myReader=new BufferedReader(new FileReader("input.txt"));
Parser myParser=new Parser();
myParser.printBNF();
while(myReader.ready()){
String eachLine=myReader.readLine();
int length=eachLine.length();
A a=new A();
Result result=a.parse(eachLine,0,length-1);
if(result.isAccepted){
System.out.print("accept:\t"+eachLine);
if(result.nextPosition!=length){
System.out.print(" result.nextPosition="+result.nextPosition);
System.out.print(" length="+length);
System.out.println(" parser program error");
}
else System.out.println();
}
else System.out.println("error:\t"+eachLine);
}
myReader.close();
}
}
class Result{
public boolean isAccepted=false;
public int nextPosition=0;
Result(){isAccepted=false;}
Result(int newPosition){nextPosition=newPosition;isAccepted=true;}
}
class Super{
String token=null;
Result result=null;
String getToken(String input,int startPosition,int endPosition)throws Exception{
if(startPosition > endPosition) throw new Exception("input ended");
return ""+input.charAt(startPosition);
}
}
class A extends Super{
Result parse(String input,int startPosition,int endPosition)throws Exception{
token=getToken(input,startPosition,endPosition);
if(token.equals("f")){
B b=new B();
result=b.parse(input,startPosition + token.length(),endPosition);
}
if(token.equals("g")){} else return new Result();
C c=new C();
return c.parse(input,startPosition + token.length(),endPosition);
}
}
class B extends Super{
Result parse(String input,int startPosition,int endPosition)throws Exception{
token=getToken(input,startPosition,endPosition);
if(token.equals("g")){
D d=new D();
result=d.parse(input,startPosition + token.length(),endPosition);
}
if(result.isAccepted){} else return new Result();
D d=new D();
result=d.parse(input,startPosition+ token.length(),endPosition);
return d.parse(input,startPosition + token.length(),endPosition);
}
}
class C extends Super{
Result parse(String input,int startPosition,int endPosition)throws Exception{
token=getToken(input,startPosition,endPosition);
if(token.equals("f")){
B b=new B();
result=b.parse(input,startPosition + token.length(),endPosition);
}
if(result.isAccepted){} else return new Result();
B b=new B();
return b.parse(input,startPosition + token.length(),endPosition);
}
}
class D extends Super{
Result parse(String input,int startPosition,int endPosition)throws Exception{
token=getToken(input,startPosition,endPosition);
if(token.equals("g")){
E e=new E();
result=e.parse(input,startPosition + token.length(),endPosition);
}
if(result.isAccepted){} else return new Result();
E e=new E();
return e.parse(input,startPosition + token.length(),endPosition);
}
}
class E extends Super{
Result parse(String input,int startPosition,int endPosition)throws Exception{
token=getToken(input,startPosition,endPosition);
startPosition=startPosition + token.length();
if(token.equals("f")) return new Result(startPosition);
if(token.equals("g")) return new Result(startPosition);
if(token.equals("(")){}else return new Result();
A a=new A();
result=a.parse(input,startPosition,endPosition);
startPosition=result.nextPosition;
if(result.isAccepted){}else return new Result();
token=getToken(input,startPosition,endPosition);
startPosition=startPosition+ token.length();
if(token.equals(")")){}else return new Result();
return new Result(startPosition);
}
}
input.txtの内容
gfggf
fg(ff)
ggg(fgfg)
fgg(gfgg)
g(fggf)
以下出力結果
<A>::= f<B>|g<C>
<B>::= g<D> | <D><D>
<C>::= f<B>| <B>
<D>::= g<E> | <E>
<E>::= f | g|(<A>)
accept:gfggf
error:fg(ff)
accept:ggg(fgfg)
accept:fgg(gfgg)
error: g(fggf)
となるようにプログラムを変更してもらえませんか?