【问题标题】:"Encountered" error which should not be there不应该出现的“遇到”错误
【发布时间】:2014-09-26 14:57:50
【问题描述】:

我目前正在使用 JavaCC、Eclipse 和 JTB 使用解析器开发一种简单的语言。我这样做是出于学习目的。当我运行 .java 文件时,它给了我以下错误:

Encountered " "var" "var "" at line 2, column 5.
Was expecting: ":" ... 

但是当我查看我的代码时,第 2 行没有这样的东西??!! 我知道这个错误不应该出现由于之前的错误,我已经调试了大约 2 个小时了......

编辑 这是包含“var”的令牌代码:

TOKEN : 
{
  < REQUIRE: "require" >
| < IF: "if" >
| < WHILE:"while" >
| < VAR:"var" >
| < STOP:"stop" >
| < EXEC:"exec" >
| < ELSE:"else" >
}

这是“var”的规则定义:

void VariableDeclaration():{}
{

  "var" VariableName() "=" MathExpression() "."
}

void VariableAssign():{}
{
  VariableName() "=" MathExpression() "."
}

希望这会有所帮助:)

【问题讨论】:

  • 你能包含它试图读取的代码吗?至少是第一位?
  • @Pokechu22 第一行?确定
  • 出现错误是因为解析器在期待一组不包含“var”的令牌时遇到了令牌“var”。如果您想要更好的答案,则必须同时发布输入文本和语法的相关部分。如果您打开解析器调试,您将确切地看到发生了什么。
  • 当它解析 "var " 时,看起来你最后有空格。这可能就是它给你错误的原因。您的语法可能是正确的,但由于它看到的是 "var " 而不仅仅是 "var" 它会给您一个错误。查看您的代码,看看您是否正确地忽略了应该忽略的空格。
  • @mcon 所有的空格都可以,这里没有错:(

标签: java eclipse token abstract-syntax-tree javacc


【解决方案1】:

由于解析器遇到了字符序列“var”,因此输出了此错误消息,该字符序列被识别为解析器在遇到它时未处于预期状态的令牌种类。一种可接受的标记类型与字符序列“:”相关联。

简而言之,记号序列不是语法所描述的语言。

如果您想了解更多信息,您应该提出一个新问题。例如。给定这个语法......,为什么这个输入......,导致我的 JavaCC 生成的解析器发出这个错误消息......。但是,在将大型语法复制到堆栈交换之前,您应该 (a) 尝试自己解决问题——例如使用 JavaCC 出色的调试选项——并且 (b) 将问题归结为最小的失败示例。

【讨论】:

  • 实际上所有的函数/关键字在语法中都被描述为一种标记类型,但它只给我一个用于定义的“var”错误
猜你喜欢
  • 2023-01-31
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多