使用Antlr4片段简化TOKEN规则时遇集合引用不支持错误求助
解决ANTLR中集合内引用Fragment报错的问题
问题背景
现有可正常运行的TOKEN规则,要求:
- 不能以
+或-开头 - 后续字符允许使用
+或- - 需排除一系列特殊字符
原规则如下:
TOKEN : ~('+' | '-' | '\u0000' .. '\u001F' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@') ~('\u0000' .. '\u001F' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@')+ ;
尝试用fragment简化规则后触发错误:
fragment EXCLUDED : ('\u0000' .. '\u001F' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@'); fragment RESERVED : ('+' | '-') ; TOKEN : ~(RESERVED | EXCLUDED) ~(EXCLUDED)+ ;
错误提示:rule reference RESERVED is not currently supported in a set
错误原因
ANTLR不允许在字符集合(如~(...)这类否定集合)中引用fragment规则,集合内仅支持直接书写单个字符、字符范围或预定义字符集。
解决方案
方案一:直接展开RESERVED内容
保留EXCLUDED fragment简化重复逻辑,将RESERVED中的+和-直接写入集合:
fragment EXCLUDED : ('\u0000' .. '\u001F' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@'); TOKEN : ~('+' | '-' | EXCLUDED) ~(EXCLUDED)+ ;
方案二:拆分规则逻辑
将开头字符与后续字符的规则分别用fragment定义,既规避集合引用限制,又让逻辑更清晰:
fragment EXCLUDED : ('\u0000' .. '\u001F' | ' ' | '<' | '>' | ':' | '"' | '/' | '\\' | '|' | '?' | '*' | '#' | '@'); fragment START_CHAR : ~('+' | '-' | EXCLUDED); fragment FOLLOW_CHAR : ~(EXCLUDED); // 允许包含+、- TOKEN : START_CHAR FOLLOW_CHAR+ ;
内容的提问来源于stack exchange,提问作者paul allen
相关产品推荐
相关产品推荐

