-2
 public class leftrec {

 static int isleft(String[] left,String[] right)

    {
       int f=0;
       for(int i=0;i<left.length;i++)
       {
           for(int j=0;j<right.length;j++)

           {
               if(left[i].charAt(0)==right[j].charAt(0))
               {
                   System.out.println("Grammar is left recursive");
                   f=1;
               }

           }
       }
          return f;   
    }
    public static void main(String[] args) {
        // TODO code application logic here
        String[] left=new String[10];
        String[] right=new String[10];
        Scanner sc=new Scanner(System.in);
        System.out.println("enter no of prod");
        int n=sc.nextInt();
        for(int i=0;i<n;i++)
        {
            System.out.println("enter left prod");
            left[i]=sc.next();
            System.out.println("enter right prod");
            right[i]=sc.next();
        }

        System.out.println("the productions are");
        for(int i=0;i<n;i++)
        {
            System.out.println(left[i]+"->"+right[i]);
        }
        int flag=0;
       flag=isleft(left,right);
           if(flag==1)
           {
               System.out.println("Removing left recursion");
           }
           else
           {
               System.out.println("No left recursion");
           }       
    }
}

このコードは、指定された文法が再帰的に残されているかどうかを調べるために作成しました。プログラムをコンパイルするとNullPointerException、行で表示されます

if(left[i].charAt(0)==right[j].charAt(0))

isleft(left,right);

例外を削除するにはどうすればよいですか?

4

3 に答える 3

2

入力に問題があると思います。文字列配列の長さを 10 としているだけです。

String[] left=new String[10];
String[] right=new String[10];

文字列配列の長さをハードコーディングしないでください

int n=sc.nextInt();
String[] left=new String[n];
String[] right=new String[n];
for(int i=0;i<n;i++){
    System.out.println("enter left prod");
    left[i]=sc.next();
    System.out.println("enter right prod");
    right[i]=sc.next();
}

たぶん、これが問題だろう

于 2014-01-17T05:08:49.100 に答える
0

次のようにコードを変更する必要があります::

package com.cgi.ie2.common;

import java.util.Scanner;

public class LeftRecursive {

static int isleft(String[] left, String[] right)
{
    int f = 0;
    for (int i = 0; i < left.length; i++) {
        for (int j = 0; j < right.length; j++)
        {
            if (left[i].charAt(0) == right[j].charAt(0)) {
                System.out.println("Grammar is left recursive");
                f = 1;
            }
        }
    }
    return f;
}

public static void main(String[] args) {
    // TODO code application logic here
    Scanner sc = new Scanner(System.in);
    System.out.println("enter no of prod");
    int n = sc.nextInt();
    //Changes done here::::
    String[] left = new String[n];
    String[] right = new String[n];
    for (int i = 0; i < n; i++) {
        System.out.println("enter left prod");
        left[i] = sc.next();
        System.out.println("enter right prod");
        right[i] = sc.next();
    }

    System.out.println("the productions are");
    for (int i = 0; i < n; i++) {
        System.out.println(left[i] + "->" + right[i]);
    }
    int flag = 0;
    flag = isleft(left, right);
    if (flag == 1) {
        System.out.println("Removing left recursion");
    } else {
        System.out.println("No left recursion");
    }
}
  }

このコードは NullpointerExceptions を排除します

いいえを取得する場合。コンソールからの製品の場合、文字列配列はそれに応じて設定する必要があります。そのため、私が行った変更は次のとおりです::

    System.out.println("enter no of prod");
    int n = sc.nextInt();
    //Changes done here::::
    String[] left = new String[n];
    String[] right = new String[n];

そして、より良いコードについては、基本的なコーディング規則に従う必要があることをお勧めします。これにより、コードが読みやすくなります。コードは、正しく実行される場合にのみ完璧ではありません。コーディング規則に従っている場合、コードは完璧です。したがって、次の手順を実行してくださいコーディング規約の基本的な考え方を理解するためのリンク::

http://www.javacodegeeks.com/2012/10/java-coding-conventions-considered-harmful.html http://java.about.com/od/javasyntax/a/nameconventions.htm

于 2014-01-17T05:12:10.827 に答える
0

サイズなしで配列を初期化することはできません。配列のサイズは既に 10 として指定されています。10 より大きいまたは 10 より小さい積を入力すると、エラーが発生します。そのため、動的サイズを使用する場合は、Java コレクションを使用する必要があります。これに対する最善のアプローチは配列リストです

static int isLeft(ArrayList 左、ArrayList 右)

    {
        int f = 0;
        for (int i = 0; i < left.size(); i++) {
            for (int j = 0; j < right.size(); j++)

            {
                if (left.get(i).charAt(0) == right.get(j).charAt(0)) {
                    System.out.println("Grammar is left recursive");
                    f = 1;
                }

            }
        }
        return f;

    }

    public static void main(String[] args) {
        // TODO code application logic here
        ArrayList<String> left = new ArrayList<String>();
        ArrayList<String> right = new ArrayList<String>();


        Scanner sc = new Scanner(System.in);
        System.out.println("enter no of prod");
        int n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            System.out.println("enter left prod");
            String leftText = sc.next();
            left.add(leftText);
            System.out.println("enter right prod");
            String rightText = sc.next();
            right.add(rightText);
        }

        System.out.println("the productions are");
        for (int i = 0; i < n; i++) {
            System.out.println(left.get(i) + "->" + right.get(i));
        }
        int flag;
        flag = isLeft(left, right);
        if (flag == 1) {
            System.out.println("Removing left recursion");
        } else {
            System.out.println("No left recursion");
        }

    }
于 2014-01-17T05:42:49.710 に答える