如何用ANTLR4匹配含内部双引号的VM变量引用类字符串?
问题成因
- ANTLR执行逻辑是词法分析优先于语法分析,且词法规则遵循最长匹配、贪婪匹配原则。你将双引号
"定义为语法层面的终结符时,词法分析器无法感知上下文,扫描到VM函数内部的第一个双引号时,会直接将其判定为外层属性值的闭合引号返回给语法解析器,导致匹配提前终止。 - 现有规则没有对嵌套引号的边界做区分,默认只要遇到双引号就判定为当前字符串的结束标记,没有识别到内部双引号属于VM参考表达式的一部分。
解决方案
方案1:使用词法模式(Lexical Modes)处理上下文
扫描到HTML属性起始的href="特征时,切换到专属的VM属性值解析模式:
- 该模式下,只有当双引号
"后紧跟>、空格等属性结束特征时,才判定为外层闭合引号,切回默认HTML解析模式 - 其余场景下的双引号均标记为VM表达式内部的普通字符,直到完整匹配到VM参考表达式后再检测闭合标记
方案2:调整语法规则优先级,补充语义谓词
修改原有的属性值语法规则,提高VM参考表达式的匹配优先级:
attrValue: '"' ( reference {isValidReferenceStart($reference)}? | ~'"' )* '"'
通过语义谓词isValidReferenceStart判断当前位置是否符合VM表达式的起始特征(如以$开头),让解析器优先匹配完整的reference规则,而非遇到双引号就直接截断。
方案3:重构支持嵌套的字符串词法规则
直接在词法层定义支持嵌套VM引用的字符串规则,示例:
QUOTED_VM_ATTR: '"' ( ~[$"] | '$' ~["]* | '"' ~[$"]* '"' )* '"';
该规则会自动吞掉VM表达式内部的双引号,直到匹配到最外层的闭合双引号为止。
内容的提问来源于stack exchange,提问作者zhangbushi5
相关产品推荐
相关产品推荐

