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

如何处理字符串内含分号的语句解析?Lexer模式适配求助

解决字符串内嵌分号的Lexer解析问题

你的核心问题是Lexer未识别字符串边界,直接把字符串内的分号当成了语句终止符。必须修改Lexer规则,优先识别完整的字符串(包括转义引号、多行内容),才能避免提前触发ENDSEMI。

问题根源

原规则中CONTENT : ~[;]+ ;会匹配所有非分号字符,一旦遇到字符串内的;,CONTENT就会截断,ENDSEMI立刻匹配该分号并弹出模式,导致后续字符串内容被错误分割,Parser无法正常处理。

修正后的Lexer规则

ASK     : 'ASK' -> pushMode(UNTILSEMI) ;
ANSWER  : 'ANSWER' -> pushMode(UNTILSEMI) ;

mode UNTILSEMI;
ENDSEMI   : ';'+ -> popMode ;
// 优先匹配带转义引号的多行字符串,包含内部分号、换行
STRING    : '"' ( '\\"' | ~["] | '\r'? '\n' )* '"' ;
// 匹配除分号、引号外的其他内容(如INTO、变量名、+符号等)
CONTENT   : ~[;"\r\n]+ | '\r'? '\n' ;

修正后的Parser规则

askStmt: ASK (STRING | CONTENT)* ENDSEMI;
answerStmt: ANSWER (STRING | CONTENT)* ENDSEMI;

原理说明

  • STRING规则优先级最高:Lexer遇到双引号时,会优先匹配完整的字符串(包括内部的转义引号、换行、分号),不会被字符串内的分号打断。
  • CONTENT规则仅处理非字符串、非分号内容:负责匹配INTO、变量名、+等符号,以及换行符。
  • ENDSEMI仅匹配字符串外的分号:只有当分号不在字符串内部时,才会被识别为语句终止符,触发模式弹出。

这样就能正确解析你提供的所有测试用例,包括内嵌分号的多行字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:42:56