[英]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.