Java中的解析错误
这是LL(1)解析器的代码。当我输入时,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
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);
}
}
}