在lexer中我有:
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: [trn ]+ { setType(WS); };
CONTENT: .+? ('@' | '}' | 'else' | 't' | 'r' | 'n' ) ;
CONTENT规则匹配所有内容,但包括终止它的令牌。这不是语法所需要的:它需要匹配所有,直到结束符,不包括。
有办法做我想做的吗?
您可以尝试使用以下代码:
CONTENT: ~('@' | '}' | 'e' | 't' | 'r' | 'n' )+;
NOT_ELSE: 'e' -> type(CONTENT);
但是在这种情况下,您将有几个CONTENT
规则而不是一个。您可以在解析器规则级别解决此问题。
现在,我已经创建了一个方法,将保留令牌合并为一个,并使用反射将新列表提供给解析器。不是很漂亮,但是现在可以了。