简单的语法不起作用

时间:2012-02-13 16:14:06

标签: antlr

我有一个简单的语法来解析包含括号之间的标识符和关键字的文件(希望如此):

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;
            };

然后它有效。你能帮我解决一下原因吗?

最好的问候。

1 个答案:

答案 0 :(得分:1)

1 st 语法失败,因为只要词法分析器看到 "[K",词法分析器就会输入KEYWORD规则。如果它在您的情况下遇到"eyword]""i"之外的其他内容,则会尝试返回可以匹配"[K"的其他规则。但是没有其他词法规则以"[K"开头,因此会抛出异常。请注意,词法分析器不会删除"K",然后再次尝试匹配(词法分析器是 dumb 机器)!

你的2 nd 语法有效,因为当"[Ki"未被KEYWORD匹配时,词法分析器现在可以找到可以依赖的内容} ID现在包含"["