You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java ANTLR4词法文件CHAR_LITERAL规则解析及等价性验证

Java字符字面量ANTLR规则疑问解答

先看原规则:

CHAR_LITERAL:       '\'' (~['\\\r\n] | EscapeSequence) '\'';

fragment EscapeSequence
    : '\\' 'u005c'? [btnfr"'\\]
    | '\\' 'u005c'? ([0-3]? [0-7])? [0-7]
    | '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
    ;

1. 为什么第一个分支不排除\b、\t、\f、"?

这完全符合Java语言规范:

  • \b(退格)、\t(制表符)、\f(换页)属于合法的可直接嵌入字符字面量的控制字符,Java允许在单引号之间直接输入这些字符(比如直接打一个制表符,而非用\t转义),所以不需要排除。
  • 双引号"在字符字面量里就是普通字符,因为字符字面量用单引号界定,'"'本身就是合法的Java字符字面量,自然不需要排除。
  • 而被排除的'(单引号)是字面量的界定符,\是转义符,\r/\n是换行符——Java不允许字符字面量跨多行,所以这些必须排除,只能通过转义序列来表示。

2. 修改为~['\\\r\n\b\f\t\"]是否等价?

不等价。
原规则允许直接匹配\b、\t、\f、"这些字符,修改后的规则把它们排除了,意味着这些字符只能通过转义序列(比如\t、\")才能被匹配。但Java本身允许直接在字符字面量中嵌入这些字符(比如直接输入制表符),所以修改后的规则会错误拒绝这类合法的字符字面量,和原规则的语义不符。

3. 修改为~['\\']是否等价?

不等价。
原规则特意排除了\r和\n,因为Java的字符字面量必须是单行的,不允许在单引号之间出现换行。修改后的规则去掉了这两个排除项,会错误匹配包含换行的非法字符字面量,违反Java语法规范。

内容的提问来源于stack exchange,提问作者pain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:57:47