2

在下面的语法中,我尝试将任何'以单行注释开头的行配置为介于/' Multiline Comment '/. 单行注释工作正常。但是由于某种原因,一旦我按下/'或';' 或<'>' 我得到下面的错误。我没有配置上述字符。他们不应该被认为是默认的并跳过解析吗?

错误

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 定义,请访问链接

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")?>
}
4

1 回答 1

3

我无法重现您问题的各个方面。您说“一旦输入某些字符就会出现错误” 。这是我得到的。

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

我不确定为什么您会期望这些不是错误,因为您的词法分析器没有涵盖这些情况的规则。一般当没有规则匹配输入的前缀并且输入没有用完时,会TokenMgrError抛出一个异常。

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

TOKEN: { <UNEXPECTED_CHARACTER: ~[] > }

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

SKIP : { < ~[] > }

对于大多数语言来说,这将是一件奇怪的事情,这就是为什么它不是默认的。

于 2013-05-26T15:52:48.760 回答