gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:47:38 26 4
gpt4 key购买 nike

我已经创建了一个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() ")"
}

执行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.

从我的角度来看,可能有两种可能性

  1. 我从用户那里获取的输入是错误的[在这种情况下,请提出建议以及如何从文件中获取输入

  2. 我的语法错误。请推荐

谁能指导一下吗?

最佳答案

问题已上线

SKIP: {"" | "\t" | "\n" | "\r" }

这表示您要跳过任何长度为 0 的字符串。问题是,找到这样的标记后,词法分析器会从输入中删除 0 个字符,然后,当然,它会找到相同的 0 长度标记,依此类推无限

也许你的意思是

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。

关于java - 为什么每次使用 javacc 工具解析赋值语句时语法检查都会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29531506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com