2016-09-22 39 views
0

在词法分析器非贪婪规则,我有: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') ; 

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

有没有办法做我想要的?

回答

0

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

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

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

+0

这只是移动问题。这也使得解析器需要处理更多的数据,然后当CONTENT只是一堆组合字符。 我没有在使用TokenStreamRewriter的过程中,但这几乎没有记录。并不像我预期的那样工作。 –

0

现在,我创建了一个方法,将centain标记合并到一个中,并使用反射将新列表提供给解析器。不完全漂亮,但它现在工作。