递归下降解析的错误

时间:2013-06-19 13:01:51

标签: java bnf recursive-descent

我正在使用给定的BNF语法进行递归的正确解析。我能用C ++创建一个,但我不擅长java,并试图从c ++镜像我的代码。

到目前为止,这是我从包含

的输入文件中读取的设置
a=a**b+ca=a+b-c*d

a=a\b

a=a^2

a=a**b++z

a=b

它似乎读取了第一个字符串并给了我一个输出,但之后它只是在Main,A,E,T,F,P I和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;
}
}

1 个答案:

答案 0 :(得分:0)

看看这个:

public static boolean A() {
    if (I()) { ... }
    --i;
    if (E()) { ... }
    ...
}

在第一个i = 0之后假设if - 将会发生什么?