为什么每次使用 javacc 工具解析赋值语句时语法检查都失败?
Why am I getting syntax checking failed everytime I parse an assignment statement using javacc tool?
我做了一个 AssignStatement
class 并且我正在尝试使用 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() ")"
}
我完成后得到的输出 java AssignStatement
"a=10+20*30" or a=10+20*30
Syntax checking failed error: Bailing out of infinite loop caused by repeated empty string matches at line 1, column 1.
在我看来你有两种可能
我错误地接受了用户的输入[在这种情况下,请提出建议以及如何从文件中接受输入
我的语法有误。请推荐
有没有人可以指导一下?
问题在线
SKIP: {"" | "\t" | "\n" | "\r" }
这表示您想跳过任何长度为 0 的字符串。问题是找到这样一个标记后,词法分析器从输入中删除了 0 个字符,然后,当然,它找到了相同的 0 长度标记,依此类推 ad infinitum.
也许你的意思是
SKIP: {" " | "\t" | "\n" | "\r" }
现在,在输入 "a=10+20*30" 时,没有正则表达式匹配,您将得到一个 TokenManagerError。
匹配空字符串有其(罕见)用途。这不是其中之一。
第二个问题是规则
TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["0"-"9"])+> }
由于ID的定义和NUM的定义一样,所以永远不会成功。也许你想要像
这样的东西
TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["a"-"z"])+> }
如果你这样做,你将不会在输入 "a=10+20*30" 上得到 TokenManagerError。
我做了一个 AssignStatement
class 并且我正在尝试使用 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() ")"
}
我完成后得到的输出 java AssignStatement
"a=10+20*30" or a=10+20*30
Syntax checking failed error: Bailing out of infinite loop caused by repeated empty string matches at line 1, column 1.
在我看来你有两种可能
我错误地接受了用户的输入[在这种情况下,请提出建议以及如何从文件中接受输入
我的语法有误。请推荐
有没有人可以指导一下?
问题在线
SKIP: {"" | "\t" | "\n" | "\r" }
这表示您想跳过任何长度为 0 的字符串。问题是找到这样一个标记后,词法分析器从输入中删除了 0 个字符,然后,当然,它找到了相同的 0 长度标记,依此类推 ad infinitum.
也许你的意思是
SKIP: {" " | "\t" | "\n" | "\r" }
现在,在输入 "a=10+20*30" 时,没有正则表达式匹配,您将得到一个 TokenManagerError。
匹配空字符串有其(罕见)用途。这不是其中之一。
第二个问题是规则
TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["0"-"9"])+> }
由于ID的定义和NUM的定义一样,所以永远不会成功。也许你想要像
这样的东西TOKEN:{ ... <NUM: (["0"-"9"])+> | <ID:(["a"-"z"])+> }
如果你这样做,你将不会在输入 "a=10+20*30" 上得到 TokenManagerError。