ANTLR4字符字面量识别异常问题求助
问题分析与解决
你的问题根源在于CHARACTER片段的字符范围未包含+、*、%、_这类符号对应的Unicode码点:
- +的Unicode码是
\u002B,*是\u002A,%是\u0025,_是\u005F - 你当前的
CHARACTER规则从\u0032(对应数字"2")开始定义范围,上述符号的码点都小于\u0032,自然无法被匹配,导致CHAR_LIT规则失效,触发识别错误。
修复方案
最简洁且不易遗漏的方式是直接匹配除单引号和反斜杠外的所有字符(因为这两个需要通过转义序列处理),修改后的规则如下:
CHAR_LIT : '\'' (CHARACTER | ESCAPE_CHAR) '\''; fragment CHARACTER : ~['\\]; // 匹配任意非单引号、非反斜杠的字符 fragment ESCAPE_CHAR : '\\' [tnr"'\\];
如果你希望严格限定为可打印ASCII字符(排除控制字符),也可以明确指定范围:
CHAR_LIT : '\'' (CHARACTER | ESCAPE_CHAR) '\''; fragment CHARACTER : [\u0020-\u0021\u0023-\u0026\u0028-\u002E\u0030-\u007E\u0080-\u0091\u0093-\u0126]; // 包含所有可打印ASCII(\u0020到\u007E),排除'(\u0027)和\(\u005C),同时保留你原有的扩展字符范围 fragment ESCAPE_CHAR : '\\' [tnr"'\\];
验证效果
修改后,print('+')、print('_')、print('%')这类语句中的字符字面量都会被正确识别为CHAR_LIT Token,不会再触发识别错误。
内容的提问来源于stack exchange,提问作者luisepa1420
相关产品推荐
相关产品推荐

