1

私は、与えられた BNF 文法を使用して、再帰的な適切な解析に取り組んでいました。C++ で作成することはできましたが、Java が苦手で、C++ からコードをミラーリングしようとしました。

これまでのところ、これは私のセットアップで、次を含む入力ファイルから読み取ります

a=a**b+ca=a+b-c*d

a=a\b

a=a^2

a=a**b++z

a=b

最初の文字列を読み取って出力を返すようですが、その後、メイン、A、E、T、F、PI、および C でエラーが発生します。これがエラーです。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: -1
    at java.lang.String.charAt(Unknown Source)
    at Main.C(Main.java:196)
    at Main.I(Main.java:182)
    at Main.P(Main.java:134)
    at Main.F(Main.java:117)
    at Main.T(Main.java:96)
    at Main.E(Main.java:73)
    at Main.A(Main.java:61)
    at Main.main(Main.java:32)

繰り返しますが、私はJavaが苦手で、ミラーリングしようとすると、この笑になりました。

誰かが私がどこで間違ったのかを理解するのを手伝ってくれるなら、これがコードです ありがとう

import java.io.*;
import java.util.Scanner;


public class Main {
static String c;
static int i;

public static void main(String[] args) throws IOException {
    File in = new File("input.txt");
    Scanner scan = new Scanner(in);

    System.out.println("Recurisve Descent Parsing\n");


    while(scan.hasNextLine())
    {
        c = scan.nextLine();
        i = 0;

        System.out.println("\nString Read: " + c);
        if (A() && i == c.length()) 
        {
            System.out.println("\nThe string \"" + c + "\" is in the language.");
        }
        else
        {
            System.out.println("\nThe string \"" + c + "\" is not in the language.");
        }
    }
    System.out.println();
    System.out.println("End of Java program");
}

//A-> I = E | E
public static boolean A() {

    if (I())
    {
        if (i < c.length() && c.charAt(i) == '=') 
        {
            ++i;
            if (E())
            {
                return true;
            }
        }
    }
    --i;
    if(E())
    {
        return true;
    }

    return false;
}

//E-> T+E | T-E | T
public static boolean E()
{

    if (T()) 
    {
        if (i < c.length() && (c.charAt(i) == '+' || c.charAt(i) == '-'))
        {
            ++i;
            if (T()) 
            {
                return true;
            }
        }
        else
        {
            return true;
        }
    }

    return false;
}

//T-> F*T | F / T | F
public static boolean T() 
{

    if (F())
    {
        if(i < c.length() && (c.charAt(i) ==  '*' || c.charAt(i) == '/'))
        {
            ++i;
            if(T())
            {
                return true;
            }
        }
        else
        {
            return true;
        }
    }
    return false;
}

//F-> P ^ F | P
public static boolean F()
{
    if(P())
    {
        if(i < c.length() && c.charAt(i) == '^')
        {
            ++i;
            return true;
        }
    }
    else
    {
        return true;
    }
    return false;
}

//P-> I | L | UI | UL | (A)
public static boolean P(){
    if(I())
    {
        return true;
    }
    if(L())
    {
        return true;
    }
    if(U())
    {
        if(I())
        {
            return true;
        }
        if(L())
        {
            return true;
        }
    }
    else if(i < c.length() && c.charAt(i) == '(')
    {
        ++i;
        if(A())
        {
            if(i < c.length() && c.charAt(i) == ')')
            {
                ++i;
                return true;
            }
        }
    }
    return false;       
}

//U-> + | - | !
public static boolean U()
{
    if(i < c.length() && (c.charAt(i) == '+' || c.charAt(i) == '-' || c.charAt(i) == '!'))
    {
        ++i;
        return true;
    }
    return false;
}

//I-> C | CI
public static boolean I()
{
    if(C())
    {
        if(I())
        {
            return true;
        }
        return true;
    }
    return false;
}

//C-> z | ..... | z    
public static boolean C()
{
    if(i < c.length() && 'a' <= c.charAt(i) && c.charAt(i) <= 'z')
    {
        ++i;
        return true;
    }
    return false;
}

//L->D | DL
public static boolean L()
{
    if(D())
    {
        if(L())
        {
            return true;
        }
        return true;
    }
    return false;
}

//D-> 0| ....... | 9
public static boolean D()
{
    if(i < c.length() && '0' <= c.charAt(i) && c.charAt(i) <= '9')
    {
        ++i;
        return true;
    }
    return false;
}
}
4

1 に答える 1