为什么每次使用javacc工具解析赋值语句时语法检查都失败了?

为什么每次使用javacc工具解析赋值语句时语法检查都失败了?,java,compiler-construction,io,javacc,Java,Compiler Construction,Io,Javacc,我已经创建了一个AssignStatement类,我正在尝试使用javacc传递字符串 赋值语句的形式为:a=b+c*d 这是源代码 PARSER_BEGIN(AssignStatement) public class AssignStatement { public static void main(String s[]) { try { AssignStatement as=new AssignStatement(System.in);

我已经创建了一个
AssignStatement
类,我正在尝试使用javacc传递字符串

赋值语句的形式为:
a=b+c*d

这是源代码

PARSER_BEGIN(AssignStatement)

public class AssignStatement
{      

  public static void main(String s[])
  {
   try
     {
       AssignStatement as=new AssignStatement(System.in);
       as.StartSymbol();
       System.out.println("Syntax checking successfully");
     }

  catch(Throwable e)
     {
      System.out.println("Syntex checking failed"+e.getMessage());
     }
  }
}

PARSER_END(AssignStatement)

   SKIP: {"" | "\t" | "\n" | "\r" }
   TOKEN:{ "(" | ")" | "+" | "*" | ":="| <NUM: (["0"-"9"])+> | <ID:(["0"-"9"])+>
         }

   void StartSymbol(): {}
  { 
    (AStmt())*<EOF>
  }

  void AStmt(): {}
 { 
  LOOKAHEAD(2) <ID> "=" AStmt() 
  | Term() ("+" Term())*
 }

  void Term(): {}
 {
  Factor() ("*" Factor())*
 } 

  void Factor(): {}
 {
    <NUM> 
  | <ID> 
  | "(" AStmt() ")"
 }
语法检查失败错误:由于第1行第1列重复的空字符串匹配而导致退出无限循环

在我看来,你有两种可能

  • 我从用户处获取的输入错误[在这种情况下,请建议以及如何从文件中获取输入]

  • 我的语法错了,请提出建议


  • 如果有人可以,请指导?

    问题在线路上

    SKIP: {"" | "\t" | "\n" | "\r" }
    
    这表示您希望跳过任何0长度的字符串。问题是,在找到这样一个标记后,lexer从输入中删除0个字符,然后,当然,它会找到相同的0长度标记,以此类推

    也许你的意思是

    SKIP: {" " | "\t" | "\n" | "\r" }
    
    现在,在输入“a=10+20*30”时,没有正则表达式匹配,您将得到一个TokenManagerError

    匹配空字符串有其(罕见的)用途。这不是其中之一

    第二个问题是规则

    TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["0"-"9"])+> }
    
    TOKEN:{…|}
    
    由于ID的定义与NUM的定义相同,因此它永远不会成功

    TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["a"-"z"])+> }
    
    TOKEN:{…|}
    

    如果这样做,您将不会在输入“a=10+20*30”上获得TokenManager错误.

    当令牌管理器以意外的方式运行时,打开调试令牌管理器选项。我按照您的指示进行了以下更正,现在我收到了以下错误,在我键入以下内容后,我无法在AssignStatement.jj文件中找到这些错误:C:\javaccprog\AssignStatement>java AssignStatement“a=10+20*30”Syntex checking failedLexical Error在第1行第1列出现错误。遇到:“\”(34),在:“:”之后打开调试令牌管理器的选项。如果您无法以这种方式解决此问题,请随时发布新问题,并提供完整的详细信息。
    TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["a"-"z"])+> }