第0行第0列的词法错误

时间:2013-05-26 00:46:40

标签: javacc

在下面的语法中,我正在尝试将以'开头的任何行配置为单行注释以及/' Multiline Comment '/之间的任何内容。单行注释正常。但出于某些原因,只要我按/'或';'或<或'&gt;'我收到以下错误。我没有配置上面的字符。它们不应被视为默认值并跳过解析吗?

错误

Lexical error at line 0, column 0.  Encountered: "\"" (34), after : ""
Lexical error at line 0, column 0.  Encountered: ">" (62), after : ""
Lexical error at line 0, column 0.  Encountered: "\n" (10), after : "-"

为了简明起见,我只包含了以下部分代码。有关Lexer的完整定义,请访问link

TOKEN :
{
  < WHITESPACE:
  " "
| "\t"
| "\n"
| "\r"
| "\f">
}

/* COMMENTS */

MORE :
{
  <"/'"> { input_stream.backup(1); } : IN_MULTI_LINE_COMMENT
}

<IN_MULTI_LINE_COMMENT>
TOKEN :
{
  <MULTI_LINE_COMMENT: "'/" > : DEFAULT
}

<IN_MULTI_LINE_COMMENT>
MORE :
{
  < ~[] >
}

TOKEN :
{
  <SINGLE_LINE_COMMENT: "'" (~["\n", "\r"])* ("\n" | "\r" | "\r\n")?>
}

1 个答案:

答案 0 :(得分:3)

我无法重现问题的每个方面。你说输入某些字符时出现错误“ ”。这就是我得到的。

  • /除非下一个字符不是',否则没有错误。如果下一个字符不是',则会出错。
  • '我没有看到任何错误。这被正确地视为评论的开始
  • ;始终存在错误。没有令牌可以以;开头。
  • <如果下一个字符不是-<-,则只会出现错误。
  • >始终存在错误。没有令牌可以以>
  • 开头

我不确定为什么你会期望这些不是错误,因为你的词法分析者没有规则来涵盖这些情况。通常,当没有规则匹配输入的前缀且输入没有用尽时,将会抛出TokenMgrError

如果您想要消除所有这些TokenMgrError,请制定一个包罗万象的规则(如常见问题解答中所述):

TOKEN: { <UNEXPECTED_CHARACTER: ~[] > }

确保这是.jj文件中的最后一条规则。此规则表明,当没有其他规则适用时,下一个字符将被视为UNEXPECTED_CHARACTER标记。当然,这只是将问题引导到解析级别。如果您真的希望令牌化程序跳过所有不属于的字符,请使用以下规则作为最后一条规则:

SKIP : { < ~[] > }

对于大多数语言来说,这样做很奇怪,这就是为什么它不是默认的。