簡體   English   中英

遞歸體面分析錯誤

[英]Errors on Recursive Decent Parsing

我正在使用給定的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,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;
}
}

看看這個:

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

假設在第一個if之后i = 0將會發生什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM