Java中的解析错误

Java中的解析错误,java,parsing,Java,Parsing,这是LL(1)解析器的代码。当我输入时,I+I 它不是根据语法进行解析 生产如下所示 > E > TFE > VUTFE > IVUTFE 在最后一部作品中有一个陷阱V 但事实并非如此 语法规则是 () 下面是代码 () 请帮助识别错误 package llparser; import java.io.*; import java.util.logging.Level; import java.util.logging.Logger; class finiteAutom

这是LL(1)解析器的代码。当我输入时,
I+I

它不是根据语法进行解析

生产如下所示

> E > TFE > VUTFE > IVUTFE
在最后一部作品中有一个陷阱<首先匹配
I
后,应消除code>V

但事实并非如此

语法规则是

()

下面是代码

()

请帮助识别错误

package llparser;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
class finiteAutomaton{  
        static String[] move = {"TF","+E","","VU","*T","I"};

    static int[][] transition = { {0,-1,-1,-1},
                                        {-1,1,-1,2},
                                        {3,-1,-1,-1},
                                        {-1,2,4,2},
                                        {5,-1,-1,-1}   };     
}



public class LLParser {

    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str=null;
            System.out.println("Enter a String for Parsing [ end with [;] ] :");
            str=br.readLine();
            str=str.toUpperCase();
            if(!str.endsWith(";"))
                throw new Exception("String should end with [;]");

            str=str.substring(0,str.length()-1);
            String temp = str.replaceAll(" ", "");       
            System.out.println(temp);
            String tokenizedString;
            String left;
            String right="";
            str=temp;
            String CSF="E";
            boolean flag=true;
            char symbol;
            int index=0;
            int SSM=0;
            int row,col;
            symbol = str.charAt(index);
            while(flag){

                     if(CSF.charAt(SSM)=='E') row=0;
                else if(CSF.charAt(SSM)=='F') row=1;
                else if(CSF.charAt(SSM)=='T') row=2;
                else if(CSF.charAt(SSM)=='U') row=3;
                else if(CSF.charAt(SSM)=='V') row=4;
                else                          row=-1;

                     if(symbol=='I') col=0;
                else if(symbol=='+') col=1;
                else if(symbol=='*') col=2;
                else if(symbol==';') col=3;
                else                 col=-1;

                if(row==-1 || col==-1 || finiteAutomaton.transition[row][col]==-1){
                        System.out.println("Error in Expression!");
                        System.exit(0);
                }
                tokenizedString=finiteAutomaton.move[finiteAutomaton.transition[row][col]];

                left = CSF.substring(0, SSM);
                int len=CSF.length();
                if(SSM<len)
                    right= CSF.substring(SSM);
                else
                    right="";
                left = left + tokenizedString + right;
                CSF = left;

                if(symbol==tokenizedString.charAt(0)){
                    SSM++;
                    symbol = str.charAt(++index);
                    System.out.println("SSM=" + SSM + " symbol="+ symbol);
                }

                if(str.equals(CSF))
                {
                    flag=false;
                }
            }
            if(!flag){
                System.out.println("String Accepted by Parser!");
            }



        } catch (IOException ex) {
            Logger.getLogger(LLParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(LLParser.class.getName()).log(Level.SEVERE, null, ex);
        }



    }
}
希望这有助于理解我的错误。

/*可以识别的语法是:
/*The grammar recognised is : 

E ::= TF 
F ::= +TF | # 
T ::= VU 
U ::= *VU | # 
V ::= I 
where I is any valid Identifer 

___________________________________________________ 
|                      | Source Symbol | 
|Non terminal|-------------------------------------| 
|            |     I   |     +   |     *   |     ; | 
|------------|---------|---------|---------|-------| 
| E          | E => TF |         |         |       | 
|------------|---------|---------|---------|-------| 
| F          |         | F => +TF|         | E => #| 
|------------|---------|---------|---------|-------| 
| T          | T => VU |         |         |       | 
|------------|---------|---------|---------|-------| 
| U          |         | U => #  | U => *VU| U => #| 
|------------|---------|---------|---------|-------| 
| V          | V => I  |         |         |       | 
|____________|_________|_________|_________|_______| 

*/
package llparser;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class finiteAutomaton{  
        static String[] move = {"TF","+E","","VU","*T","I"};

    static int[][] transition = { {0,-1,-1,-1},
                                        {-1,1,-1,2},
                                        {3,-1,-1,-1},
                                        {-1,2,4,2},
                                        {5,-1,-1,-1}   };



}
public class LLParser {

    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

            String str=null;

            System.out.println("Enter a String for Parsing [ String should end with [;] ] :");
            str=br.readLine();
            str=str.toUpperCase();

            if(!str.endsWith(";"))
                throw new Exception("String should end with [;]");

            str=str.substring(0,str.length()-1); /* removing ; from string */
            String temp = str.replaceAll(" ", "");        /* removing spaces */
            str=temp;

            String tokenizedString;
            String left;
            String right="";

            String CSF="E";
            char symbol;
            int index=0;
            int SSM=0;
            int row,col;

            symbol = str.charAt(index);

            while(!str.equals(CSF)){

                System.out.println();
                System.out.println("Input String="+str +"\tSSM="+SSM+" Symbol="+symbol + " CSF="+CSF );
                     if(CSF.charAt(SSM)=='E') row=0;
                else if(CSF.charAt(SSM)=='F') row=1;
                else if(CSF.charAt(SSM)=='T') row=2;
                else if(CSF.charAt(SSM)=='U') row=3;
                else if(CSF.charAt(SSM)=='V') row=4;
                else                          row=-1;

                     if(symbol=='I') col=0;
                else if(symbol=='+') col=1;
                else if(symbol=='*') col=2;
                else if(symbol==';') col=3;
                else                 col=-1;

                    if(row==-1 || col==-1 || finiteAutomaton.transition[row][col]==-1){
                            System.out.println("Error in Expression!" + "CSF=" + CSF + " Symbol=" + symbol);
                            System.exit(0);
                    }
                tokenizedString=finiteAutomaton.move[finiteAutomaton.transition[row][col]];

                left = CSF.substring(0, SSM);

                int len=CSF.length();
                if(SSM<len-1)
                    right= CSF.substring(SSM+1,len);
                else
                    right="";

                left = left + tokenizedString + right;
                CSF = left;

                if(  tokenizedString.equals("")){
                    continue;
                }

                if(symbol==tokenizedString.charAt(0)){
                    SSM++;
                    char prev=symbol;
                    if(index<str.length()-1)
                        symbol = str.charAt(++index);
                    else
                        symbol = ';';
                    System.out.println("\n\tMatch Found Previous Symbol="+ prev + " New Symbol="+ symbol);
                }


            }

                System.out.println("String Accepted by Parser!");




        } catch (IOException ex) {
            Logger.getLogger(LLParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(LLParser.class.getName()).log(Level.SEVERE, null, ex);
        }



    }
}
E::=TF F::=+TF |# T::=VU U::=*VU |# V::=I 其中I是任何有效的标识符 ___________________________________________________ ||源符号| |非终端|------------------------------------------- || I |+|*| | |------------|---------|---------|---------|-------| |E | E=>TF | | | | |------------|---------|---------|---------|-------| |F | F=>+TF | E=># |------------|---------|---------|---------|-------| |T | T=>VU | | | | |------------|---------|---------|---------|-------| |U | | U=>#| U=>*VU | U=># |------------|---------|---------|---------|-------| |V | V=>I | | | | |____________|_________|_________|_________|_______| */ 包解析; 导入java.io.*; 导入java.util.logging.Level; 导入java.util.logging.Logger; 类finiteAutomaton{ 静态字符串[]move={“TF”、“+E”、”“、“VU”、“*T”、“I”}; 静态int[][]转换={{{0,-1,-1}, {-1,1,-1,2}, {3,-1,-1,-1}, {-1,2,4,2}, {5,-1,-1,-1} }; } 公共类LLParser{ 公共静态void main(字符串[]args){ 试一试{ BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in)); 字符串str=null; System.out.println(“输入用于解析的字符串[字符串应以[;]]结尾]:”; str=br.readLine(); str=str.toUpperCase(); 如果(!str.endsWith(;)) 抛出新异常(“字符串应以[;]结尾”); str=str.substring(0,str.length()-1);/*正在从字符串中删除*/ 字符串temp=str.replaceAll(“,”);/*删除空格*/ str=温度; 字符串标记化字符串; 左弦; 字符串右=”; 字符串CSF=“E”; 字符符号; int指数=0; int-SSM=0; int row,col; symbol=str.charAt(索引); 而(!str.equals(CSF)){ System.out.println(); System.out.println(“输入字符串=“+str+”\tSSM=“+SSM+”Symbol=“+Symbol+”CSF=“+CSF”); 如果(CSF.charAt(SSM)='E')行=0; 如果(CSF.charAt(SSM)='F')行=1; 如果(CSF.charAt(SSM)='T')行=2; 如果(CSF.charAt(SSM)='U')行=3; 如果(CSF.charAt(SSM)='V')行=4; else行=-1; 如果(符号=='I')列=0; 如果(symbol='+')列=1,则为else; 如果(symbol='*')列=2,则为else; 如果(符号==';')列=3; else col=-1; 如果(行==-1 | |列==-1 | |完成自动转换[行][col]=-1){ System.out.println(“表达式错误!”+“CSF=“+CSF+”Symbol=“+Symbol”); 系统出口(0); } tokenizedString=finiteAutomaton.move[finiteAutomaton.transition[row][col]]; 左=脑脊液子串(0,SSM); int len=CSF.length();
如果(你不认为它能帮助我们告诉我们错误信息和堆栈跟踪是什么)为什么这个标记为C++?代码是java。你是解析C++语言吗?你真的试图在调试器下一步一步地运行你的代码吗?当你使用调试器时,哪一行失败了?@ OLD程序员没有运行时错误。但是它导致-1转换。
/*The grammar recognised is : 

E ::= TF 
F ::= +TF | # 
T ::= VU 
U ::= *VU | # 
V ::= I 
where I is any valid Identifer 

___________________________________________________ 
|                      | Source Symbol | 
|Non terminal|-------------------------------------| 
|            |     I   |     +   |     *   |     ; | 
|------------|---------|---------|---------|-------| 
| E          | E => TF |         |         |       | 
|------------|---------|---------|---------|-------| 
| F          |         | F => +TF|         | E => #| 
|------------|---------|---------|---------|-------| 
| T          | T => VU |         |         |       | 
|------------|---------|---------|---------|-------| 
| U          |         | U => #  | U => *VU| U => #| 
|------------|---------|---------|---------|-------| 
| V          | V => I  |         |         |       | 
|____________|_________|_________|_________|_______| 

*/
package llparser;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class finiteAutomaton{  
        static String[] move = {"TF","+E","","VU","*T","I"};

    static int[][] transition = { {0,-1,-1,-1},
                                        {-1,1,-1,2},
                                        {3,-1,-1,-1},
                                        {-1,2,4,2},
                                        {5,-1,-1,-1}   };



}
public class LLParser {

    public static void main(String[] args) {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

            String str=null;

            System.out.println("Enter a String for Parsing [ String should end with [;] ] :");
            str=br.readLine();
            str=str.toUpperCase();

            if(!str.endsWith(";"))
                throw new Exception("String should end with [;]");

            str=str.substring(0,str.length()-1); /* removing ; from string */
            String temp = str.replaceAll(" ", "");        /* removing spaces */
            str=temp;

            String tokenizedString;
            String left;
            String right="";

            String CSF="E";
            char symbol;
            int index=0;
            int SSM=0;
            int row,col;

            symbol = str.charAt(index);

            while(!str.equals(CSF)){

                System.out.println();
                System.out.println("Input String="+str +"\tSSM="+SSM+" Symbol="+symbol + " CSF="+CSF );
                     if(CSF.charAt(SSM)=='E') row=0;
                else if(CSF.charAt(SSM)=='F') row=1;
                else if(CSF.charAt(SSM)=='T') row=2;
                else if(CSF.charAt(SSM)=='U') row=3;
                else if(CSF.charAt(SSM)=='V') row=4;
                else                          row=-1;

                     if(symbol=='I') col=0;
                else if(symbol=='+') col=1;
                else if(symbol=='*') col=2;
                else if(symbol==';') col=3;
                else                 col=-1;

                    if(row==-1 || col==-1 || finiteAutomaton.transition[row][col]==-1){
                            System.out.println("Error in Expression!" + "CSF=" + CSF + " Symbol=" + symbol);
                            System.exit(0);
                    }
                tokenizedString=finiteAutomaton.move[finiteAutomaton.transition[row][col]];

                left = CSF.substring(0, SSM);

                int len=CSF.length();
                if(SSM<len-1)
                    right= CSF.substring(SSM+1,len);
                else
                    right="";

                left = left + tokenizedString + right;
                CSF = left;

                if(  tokenizedString.equals("")){
                    continue;
                }

                if(symbol==tokenizedString.charAt(0)){
                    SSM++;
                    char prev=symbol;
                    if(index<str.length()-1)
                        symbol = str.charAt(++index);
                    else
                        symbol = ';';
                    System.out.println("\n\tMatch Found Previous Symbol="+ prev + " New Symbol="+ symbol);
                }


            }

                System.out.println("String Accepted by Parser!");




        } catch (IOException ex) {
            Logger.getLogger(LLParser.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(LLParser.class.getName()).log(Level.SEVERE, null, ex);
        }



    }
}