具有停止令牌的ANTLR4非贪婪规则

时间:2016-09-22 06:55:37

标签: antlr4

在词霸中我有:

AT:                         '@'                         -> mode(OPERATOR);
DOUBLE_AT:                  '@@'                        ;
CURLY_CLOSE:                '}'                         { block_nesting > 0 && block_nesting >= curly_nesting }? { curly_nesting--; block_nesting--; };
NORMAL_ELSE:                'else'                      { previous_is_parenthesis_close() }? { block_nesting++; tokens.clear(); setType(ELSE); } -> mode(RYTHM);
NWS:                        [\t\r\n ]+                  { setType(WS); };
CONTENT:                    .+? ('@' | '}' | 'else' | '\t' | '\r' | '\n' ) ;

CONTENT规则匹配所有内容,但包括终止它的令牌。这不是语法所需要的:它需要匹配所有,直到终止符,不包括。

有没有办法做我想要的?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用以下代码:

CONTENT:   ~('@' | '}' | 'e' | '\t' | '\r' | '\n' )+;
NOT_ELSE:   'e' -> type(CONTENT);

但在这种情况下,您将有几个CONTENT规则而不是一个。您可以在解析器规则级别上解决此问题。

答案 1 :(得分:0)

目前,我已经创建了一种方法,将centain标记合并为一个,并使用反射将新列表提供给解析器。不完全漂亮,但它现在有效。