在下面的语法中,我正在尝试将以'
开头的任何行配置为单行注释以及/' 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")?>
}
答案 0 :(得分:3)
我无法重现问题的每个方面。你说输入某些字符时出现错误“ ”。这就是我得到的。
/
除非下一个字符不是'
,否则没有错误。如果下一个字符不是'
,则会出错。 '
我没有看到任何错误。这被正确地视为评论的开始;
始终存在错误。没有令牌可以以;
开头。<
如果下一个字符不是-
或<-
,则只会出现错误。>
始终存在错误。没有令牌可以以>
我不确定为什么你会期望这些不是错误,因为你的词法分析者没有规则来涵盖这些情况。通常,当没有规则匹配输入的前缀且输入没有用尽时,将会抛出TokenMgrError
。
如果您想要消除所有这些TokenMgrError
,请制定一个包罗万象的规则(如常见问题解答中所述):
TOKEN: { <UNEXPECTED_CHARACTER: ~[] > }
确保这是.jj文件中的最后一条规则。此规则表明,当没有其他规则适用时,下一个字符将被视为UNEXPECTED_CHARACTER
标记。当然,这只是将问题引导到解析级别。如果您真的希望令牌化程序跳过所有不属于的字符,请使用以下规则作为最后一条规则:
SKIP : { < ~[] > }
对于大多数语言来说,这样做很奇怪,这就是为什么它不是默认的。