ANTLR4:三元表达式的优先级

ANTLR4:三元表达式的优先级,antlr,antlr4,Antlr,Antlr4,雅加达表达式语言规范中存在以下条件: 具有命名空间前缀的限定函数优先于 接线员。因此表达式${c?b:f()}是非法的,因为b:f()是非法的 被解析为限定函数而不是条件函数的一部分 表情。与往常一样,()可用于使优先级显式, e、 g${c?b:(f())} 语法表达语言语法; prog:复合表达; 复合表达:(动态表达|延迟表达|文字表达)*; dynamicExpression:动态启动表达式RCURL; deferredExpression:DEFERRED\u开始表达式RCURL; 文

雅加达表达式语言规范中存在以下条件:

具有命名空间前缀的限定函数优先于 接线员。因此表达式
${c?b:f()}
是非法的,因为
b:f()
是非法的 被解析为限定函数而不是条件函数的一部分 表情。与往常一样,()可用于使优先级显式, e、 g
${c?b:(f())}

语法表达语言语法; prog:复合表达; 复合表达:(动态表达|延迟表达|文字表达)*; dynamicExpression:动态启动表达式RCURL; deferredExpression:DEFERRED\u开始表达式RCURL; 文字表达:文字; literal:booleanLiteralExpression | floatingPointLiteralExpression | integerLiteralExpression | stringLiteralExpression | nullLiteralExpression; booleanLiteralExpression:BOOL_LITERAL; 浮点文字表达式:浮点文字; integerLiteralExpression:INTEGER_LITERAL; stringLiteralExpression:StringLiteral; nullLiteralExpression:NULL; 参数:LPAREN expressionList?阿伦; 表达式列表:(表达式((逗号表达式)*); lambdarameters:IDENTIFIER |(LPAREN(IDENTIFIER((逗号标识符)*))?RPAREN); mapEntry:表达式冒号表达式; 地图条目:地图条目(逗号地图条目)*; 表达 :表达式(LBRACK表达式RBRACK)#成员索引表达式 |表达式bop=点(标识符)#成员点表达式 |表达式参数#调用表达式 |前缀=(减|非|空)表达式#一元表达式 |表达式bop=(MULT | DIV | MOD)表达式#infixExpression |表达式bop=(加|减)表达式#infixExpression |表达式bop=(LE | GE | LT | GT)表达式#关系表达式 |表达式bop=标识符的实例#infixExpression |表达式bop=(EQ | NE)表达式#关系表达式 |表达式bop=和表达式#逻辑表达式 |表达式bop=或表达式#逻辑表达式 |标识符(冒号标识符)?参数#名称空间函数表达式 |表达式bop=问号表达式bop=冒号表达式#三元表达式 |表达式bop=(赋值| CONCAT)表达式#赋值表达式 |lambdarameters箭头表达式#lambdaExpression |表达式分号表达式#分号表达式 |标识符#标识符表达式 |文字 |LBRACK expressionList?RBRACK#列表表达式 |LCURL表达式列表?RCURL#集合表达式 |LCURL映射条目?RCURL#映射表达式 |LPAREN表达式RPAREN#parenExpression ; //雷克瑟 立法会网址:“{”; RCURL:'}'; BOOL|u LITERAL:TRUE | FALSE; 真:‘真’; 假:‘假’; 空:“空”; 点:'; LPAREN:'('; RPAREN:')'; LBRACK:'['; RBRACK:']'; 冒号:':'; 逗号:','; 分号:';'; GT:(“>”|“GT”); LT:(“=”|“ge”); 乐:(''; 动态启动:美元LCURL; 延迟启动:哈希LCURL; 美元:“$”; 散列:“#”; 整型文字:[0-9]+; 浮点文字:[0-9]+'.[0-9]*指数?'.[0-9]+指数?[0-9]+指数?; 碎片指数:('e'|'e')('+'|'-')?[0-9]+; StringLiteral:(“'DoubleStringCharacter*'”' |“\''SingleStringCharacter*”\''; 片段双线字符 :~[“\\\r\n] |“\\”转义序列 ; 片段单链字符 :~['\\\r\n] |“\\”转义序列 ; 片段逃逸序列 :CharacterEscapeSequence | '0' |十六进制序列 |单链构象序列 |可扩序列 ; 片段字符逃逸序列 :SingleEscapeCharacter |非替身角色 ; 片段六位逃逸序列 :“x”十六进制数字十六进制数字 ; 片段序列 :“u”六位数六位数六位数六位数六位数六位数 |'u'{'HexDigit HexDigit+'}' ; 片段延伸序列 :'u'{'HexDigit+'}' ; 片段单逃逸字符 :['“\\bfnrtv] ; 片段非替换字符 :~[“\\bfnrtv0-9xu\r\n] ; 片段逃逸字符 :SingleEscapeCharacter | [0-9] |[徐] ; 碎片六位数 :[[U 0-9a-fA-F] ; 片段十进制数 : '0' | [1-9] [0-9_]* ; 碎片指数部分 :[eE][+-]?[0-9]+ ; 碎片识别器零件 :IdentifierStart |[\p{Mn}] |[\p{Nd}] |[\p{Pc}] |“\u200C” |“\u200D” ; 片段标识符开始 :[\p{L}] | [$_] |“\\”序列 ; 标识符:字母(字母|数字)*; 字母:'\u0024'| '\u0041'..'\u005a'| “\u005f”| “\u0061”…”\u007a”| '\u00c0'..'\u00d6'| '\u00d8'..'\u00f6'| '\u00f8'..'\u00ff'| '\u0100'..'\u1ff'| '\u3040'..'\u318f'| '\u3300'..'\u337f'| “\u3400”…”\u3d2d”| '\u4e00'..'\u9fff'| “\uf900”…”\ufaff'; 数字:'\u0030'..'\u0039'| '\u0660'..'\u0669'| '\u06f0'..'\u06f9'| '\u0966'..'\u096f'| '\u09e6'..'\u09ef'| “\u0a66”…“\u0a6f”| '\u0ae6'..'\u0aef'| “\u0b66”…“\u0b6f”| “\u0be7”…“\u0bef”| '\u0c66'..'\u0c6f'| '\u0ce6'..'\u0cef'| “\u0d66”…”\u0d6f”| '\u0e50'..'\u0e59'| '\u0ed0'..'\u0ed9'| '\u1040'..'\u1049'; WS:[\t\r\n]+->跳过; 任何:。; 如何将其转换为语法错误?目前,这是经过分析的,不会返回任何错误。这些错误应该在代码端处理,还是可以在解析器端处理?

请尝试以下操作:

我添加了一个解析器规则:

qualifiedFunction: IDENTIFIER COLON IDENTIFIER arguments;
然后我将其作为
表达式
规则的第一个备选方案:

expression
    : qualifiedFunction # QFunc
然后我修改了
ternaryExpressionexpression
    : qualifiedFunction # QFunc
    | expression QUESTIONMARK qualifiedFunction  # badTernaryExpression
    | expression QUESTIONMARK  (trueExpr=expression COLON falseExpr=expression) # ternaryExpression