如何在ANTLR4 C++运行时词法规则中定义正确的字符串字面量?
解决ANTLR4 C++运行时字符串字面量跨行匹配问题
你的当前规则V_STRING : '"' ~('\' | '"')* '"';无法匹配包含实际换行的字符串,核心原因有两个:
- 规则中的
~('\' | '"')虽包含换行符,但如果语法中存在**WS规则(跳过空白字符)**且定义在V_STRING之前,字符串内部的换行会被WS规则优先匹配并跳过,导致V_STRING匹配中断。 - 现有规则未明确覆盖跨行场景的匹配逻辑,若需支持转义字符也存在缺失。
解决方案
根据你允许字符串包含实际换行、无需显式转义的需求,分两种场景处理:
场景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
相关产品推荐
相关产品推荐

