如何处理ANTLR4中DOT同时表示字典访问与拼接的歧义文法问题
ANTLR4处理
.运算符歧义的解决方案 你当前文法的歧义根源在于:DictFieldExpr仅要求.后紧跟NAME词法单元,而平级的Concatenation规则允许.后接任意expr。当解析outerDict.innerDict.key时,顶层.的右侧是innerDict.key(合法的expr但不是单个NAME),因此无法匹配优先级更高的DictFieldExpr,只能 fallback 到拼接规则。
解决方案
拆分文法层级,将字典访问的优先级提到拼接之上,通过规则分层强制优先级,避免平级规则的匹配冲突,修改后的文法如下:
grammar Test; // 顶层表达式优先走拼接逻辑 expr: concat_expr ; // 字符串拼接:低优先级,左结合,仅当`.`右侧不是单个NAME时触发 concat_expr: concat_expr DOT access_expr #Concatenation | access_expr #AccessExprWrapper ; // 字典访问:高优先级,限制`.`后只能是NAME,连续.NAME会优先递归匹配此规则 access_expr: access_expr DOT NAME #DictFieldExpr | L_PAREN expr R_PAREN #WrappedExpr | string #StringExpr | NAME #VariableExpr ; string: QUOTE .*? QUOTE; NAME: [a-zA-Z]+; L_PAREN: '('; R_PAREN: ')'; DOT: '.'; QUOTE: '"';
修改后完全符合你定义的语义要求:
- 连续的
A.B.C格式输入会全部递归匹配DictFieldExpr,不会触发拼接 "a"."b"、foo."some text"等.后为字符串的场景,会匹配拼接规则myDict.(myKey)等.后为括号包裹表达式的场景,会匹配拼接规则
内容的提问来源于stack exchange,提问作者filipp vahituli
相关产品推荐
相关产品推荐

