Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

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) 
となるようにプログラムを変更してもらえませんか?

6

回答

89481

閲覧

6件の回答

評価

0

ここは質問板であり、プログラムを書いてもらったり、
バグを取り除いてもらう板ではないですよ?
自分でやらなければ力も付きませんしね。

評価

0

実行できるプログラムに変更しました☆

public class Parser {
  public static void main(String[] args) {
    System.out.println("Hello World !");
  }
}

評価

0

ご希望の出力結果を見落としていました。
大変失礼致しました。
以下、訂正したプログラムです。

public class Parser {
  public static void main(String[] args) {
    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>) ");
    System.out.println("accept:gfggf ");
    System.out.println("error:fg(ff) ");
    System.out.println("accept:ggg(fgfg) ");
    System.out.println("accept:fgg(gfgg) ");
    System.out.println("error: g(fggf)");
  }
}

評価

0

これだけ長いコード(内容はたいしたことないようにみえますが)を書いて「動くようにしてください」と頼まれてもよほどやさしい方でないと対応してくれないと思います。

もう少し縮小しかつ多少なりともソースコメントがついていれば対応しなくもなかったですが・・・ソースを読解するのは大変ですから・・・・残念!!

評価

0

とりあえず、Exceptionをなくしたいだけなら、CとDクラスに
else result=new Result();をある場所に追加するだけです。出力結果が正しくなるような修正までする気はありませんが、Exceptionの原因程度ならお答えしましょう。

評価

0

訂正:
正しくExceptionを修正したいならresult.isAcceptedを変えたほうがいいかもね・・・

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。