如何处理字符串内含分号的语句解析?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
相关产品推荐
相关产品推荐

