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