我正在使用给定的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;
}
}
答案 0 :(得分:0)
看看这个:
public static boolean A() {
if (I()) { ... }
--i;
if (E()) { ... }
...
}
在第一个i = 0
之后假设if
- 将会发生什么?