我有一个工作
TOKEN
,排除某些字符。不得以 +
或 -
开头,但在开头之后允许使用这些字符。
TOKEN : ~('+' | '-' | '\u0000' .. '\u001f' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@') ~('\u0000' .. '\u001f' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@')+ ;
我一直在尝试使用片段来简化它......
fragment EXCLUDED : ('\u0000' .. '\u001f' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@');
fragment RESERVED : ('+' | '-') ;
TOKEN : ~(RESERVED | EXCLUDED) ~(EXCLUDED)+ ;
但是我收到错误:
rule reference RESERVED is not currently supported in a set
?
如果您使用 ANTLR 4 中较短的字符集表示法,您可能不需要使用否定片段。规则:
TOKEN
: ~('+' | '-' | '\u0000' .. '\u001f' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@') ~('\u0000' .. '\u001f' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@')+
;
与此相同:
TOKEN
: ~[+\-\u0000-\u001f <>:"/\\|?*#@] ~[\u0000-\u001f <>:"/\\|?*#@]+
;