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

如何在ANTLR4 C++运行时词法规则中定义正确的字符串字面量?

解决ANTLR4 C++运行时字符串字面量跨行匹配问题

你的当前规则V_STRING : '"' ~('\' | '"')* '"';无法匹配包含实际换行的字符串,核心原因有两个:

  1. 规则中的~('\' | '"')虽包含换行符,但如果语法中存在**WS规则(跳过空白字符)**且定义在V_STRING之前,字符串内部的换行会被WS规则优先匹配并跳过,导致V_STRING匹配中断。
  2. 现有规则未明确覆盖跨行场景的匹配逻辑,若需支持转义字符也存在缺失。

解决方案

根据你允许字符串包含实际换行、无需显式转义的需求,分两种场景处理:

场景1:无需处理转义字符(仅支持跨行字符串)

修改V_STRING规则,并确保它在WS规则之前定义:

V_STRING            :   '"' ~['"']* '"';
WS                  :   [ \t\r\n]+ -> skip; // 此规则必须放在V_STRING之后
  • ~['"']会匹配除双引号外的所有字符,包括换行符、空格等。
  • 调整规则顺序后,词法分析器会优先匹配字符串内部的所有字符(包括换行),不会被WS规则跳过。

场景2:需处理转义字符(如"、\、\n等)同时支持跨行

用片段规则处理转义序列,同时保留跨行匹配能力:

V_STRING            :   '"' (ESCAPE | ~["\\] | '\r'? '\n')* '"';
WS                  :   [ \t\r\n]+ -> skip; // 此规则必须放在V_STRING之后

fragment ESCAPE     :   '\\' (["\\/bfnrt] | UNICODE);
fragment UNICODE    :   'u' HEX HEX HEX HEX;
fragment HEX        :   [0-9a-fA-F];
  • ESCAPE片段处理所有标准转义序列,包括转义双引号、反斜杠、换行符等。
  • ~["\\]匹配除双引号和反斜杠外的普通字符,'\r'? '\n'兼容Windows和Unix风格的换行。

验证

修改后,printf("string literal\n");(带实际换行)和printf("string literal\n");(带转义换行)都能被正确匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:39:19