我有一个简单的语法来解析包含括号之间的标识符和关键字的文件(希望如此):
grammar Keyword;
// PARSER RULES
//
entry_point : ('['ID']')*;
// LEXER RULES
//
KEYWORD : '[Keyword]';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
WS : ( ' ' | '\t' | '\r' | '\n' | '\r\n')
{
$channel = HIDDEN;
};
适用于输入:
[Hi]
[Hi]
它为输入返回NoViableAltException错误:
[Hi]
[Ki]
如果我评论KEYWORD,那么它可以正常工作。另外,如果我将语法改为:
grammar Keyword;
// PARSER RULES
//
entry_point : ID*;
// LEXER RULES
//
KEYWORD : '[Keyword]';
ID : '[' ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* ']';
WS : ( ' ' | '\t' | '\r' | '\n' | '\r\n')
{
$channel = HIDDEN;
};
然后它有效。你能帮我解决一下原因吗?
最好的问候。
答案 0 :(得分:1)
1 st 语法失败,因为只要词法分析器看到 "[K"
,词法分析器就会输入KEYWORD
规则。如果它在您的情况下遇到"eyword]"
,"i"
之外的其他内容,则会尝试返回可以匹配"[K"
的其他规则。但是没有其他词法规则以"[K"
开头,因此会抛出异常。请注意,词法分析器不会删除"K"
,然后再次尝试匹配(词法分析器是 dumb 机器)!
你的2 nd 语法有效,因为当"[Ki"
未被KEYWORD
匹配时,词法分析器现在可以找到可以依赖的内容} ID
现在包含"["
。