in src/main/java/org/apache/sysds/parser/dml/DmlParser.java [2386:2782]
private ExpressionContext expression(int _p) throws RecognitionException {
ParserRuleContext _parentctx = _ctx;
int _parentState = getState();
ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState);
ExpressionContext _prevctx = _localctx;
int _startState = 10;
enterRecursionRule(_localctx, 10, RULE_expression, _p);
// This actions occurs regardless of how many alternatives in this rule
((ExpressionContext)_localctx).info = new org.apache.sysds.parser.dml.ExpressionInfo();
// _localctx.info.expr = new org.apache.sysds.parser.BinaryExpression(org.apache.sysds.parser.Expression.BinaryOp.INVALID);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
setState(488);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) {
case 1:
{
_localctx = new UnaryExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(444);
((UnaryExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__27 || _la==T__28) ) {
((UnaryExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(445);
((UnaryExpressionContext)_localctx).left = expression(18);
}
break;
case 2:
{
_localctx = new BooleanNotExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(446);
((BooleanNotExpressionContext)_localctx).op = match(T__40);
setState(447);
((BooleanNotExpressionContext)_localctx).left = expression(12);
}
break;
case 3:
{
_localctx = new BuiltinFunctionExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(448);
((BuiltinFunctionExpressionContext)_localctx).name = match(ID);
setState(449);
match(T__1);
setState(458);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__9) | (1L << T__27) | (1L << T__28) | (1L << T__40) | (1L << T__45) | (1L << T__46) | (1L << ID) | (1L << INT) | (1L << DOUBLE))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (COMMANDLINE_NAMED_ID - 65)) | (1L << (COMMANDLINE_POSITION_ID - 65)) | (1L << (STRING - 65)))) != 0)) {
{
setState(450);
((BuiltinFunctionExpressionContext)_localctx).parameterizedExpression = parameterizedExpression();
((BuiltinFunctionExpressionContext)_localctx).paramExprs.add(((BuiltinFunctionExpressionContext)_localctx).parameterizedExpression);
setState(455);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__8) {
{
{
setState(451);
match(T__8);
setState(452);
((BuiltinFunctionExpressionContext)_localctx).parameterizedExpression = parameterizedExpression();
((BuiltinFunctionExpressionContext)_localctx).paramExprs.add(((BuiltinFunctionExpressionContext)_localctx).parameterizedExpression);
}
}
setState(457);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
setState(460);
match(T__2);
setState(464);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,66,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
{
{
setState(461);
match(T__4);
}
}
}
setState(466);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,66,_ctx);
}
}
break;
case 4:
{
_localctx = new AtomicExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(467);
match(T__1);
setState(468);
((AtomicExpressionContext)_localctx).left = expression(0);
setState(469);
match(T__2);
}
break;
case 5:
{
_localctx = new MultiIdExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(471);
match(T__9);
setState(472);
((MultiIdExpressionContext)_localctx).expression = expression(0);
((MultiIdExpressionContext)_localctx).targetList.add(((MultiIdExpressionContext)_localctx).expression);
setState(477);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__8) {
{
{
setState(473);
match(T__8);
setState(474);
((MultiIdExpressionContext)_localctx).expression = expression(0);
((MultiIdExpressionContext)_localctx).targetList.add(((MultiIdExpressionContext)_localctx).expression);
}
}
setState(479);
_errHandler.sync(this);
_la = _input.LA(1);
}
setState(480);
match(T__10);
}
break;
case 6:
{
_localctx = new ConstTrueExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(482);
match(T__45);
}
break;
case 7:
{
_localctx = new ConstFalseExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(483);
match(T__46);
}
break;
case 8:
{
_localctx = new ConstIntIdExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(484);
match(INT);
}
break;
case 9:
{
_localctx = new ConstDoubleIdExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(485);
match(DOUBLE);
}
break;
case 10:
{
_localctx = new ConstStringIdExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(486);
match(STRING);
}
break;
case 11:
{
_localctx = new DataIdExpressionContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(487);
dataIdentifier();
}
break;
}
_ctx.stop = _input.LT(-1);
setState(516);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,70,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
setState(514);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,69,_ctx) ) {
case 1:
{
_localctx = new PowerExpressionContext(new ExpressionContext(_parentctx, _parentState));
((PowerExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(490);
if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)");
setState(491);
((PowerExpressionContext)_localctx).op = match(T__26);
setState(492);
((PowerExpressionContext)_localctx).right = expression(19);
}
break;
case 2:
{
_localctx = new MatrixMulExpressionContext(new ExpressionContext(_parentctx, _parentState));
((MatrixMulExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(493);
if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)");
setState(494);
((MatrixMulExpressionContext)_localctx).op = match(T__29);
setState(495);
((MatrixMulExpressionContext)_localctx).right = expression(18);
}
break;
case 3:
{
_localctx = new ModIntDivExpressionContext(new ExpressionContext(_parentctx, _parentState));
((ModIntDivExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(496);
if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)");
setState(497);
((ModIntDivExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__30 || _la==T__31) ) {
((ModIntDivExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(498);
((ModIntDivExpressionContext)_localctx).right = expression(17);
}
break;
case 4:
{
_localctx = new MultDivExpressionContext(new ExpressionContext(_parentctx, _parentState));
((MultDivExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(499);
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
setState(500);
((MultDivExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__32 || _la==T__33) ) {
((MultDivExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(501);
((MultDivExpressionContext)_localctx).right = expression(16);
}
break;
case 5:
{
_localctx = new AddSubExpressionContext(new ExpressionContext(_parentctx, _parentState));
((AddSubExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(502);
if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
setState(503);
((AddSubExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__27 || _la==T__28) ) {
((AddSubExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(504);
((AddSubExpressionContext)_localctx).right = expression(15);
}
break;
case 6:
{
_localctx = new RelationalExpressionContext(new ExpressionContext(_parentctx, _parentState));
((RelationalExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(505);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
setState(506);
((RelationalExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39))) != 0)) ) {
((RelationalExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(507);
((RelationalExpressionContext)_localctx).right = expression(14);
}
break;
case 7:
{
_localctx = new BooleanAndExpressionContext(new ExpressionContext(_parentctx, _parentState));
((BooleanAndExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(508);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
setState(509);
((BooleanAndExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__41 || _la==T__42) ) {
((BooleanAndExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(510);
((BooleanAndExpressionContext)_localctx).right = expression(12);
}
break;
case 8:
{
_localctx = new BooleanOrExpressionContext(new ExpressionContext(_parentctx, _parentState));
((BooleanOrExpressionContext)_localctx).left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(511);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(512);
((BooleanOrExpressionContext)_localctx).op = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__43 || _la==T__44) ) {
((BooleanOrExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
setState(513);
((BooleanOrExpressionContext)_localctx).right = expression(11);
}
break;
}
}
}
setState(518);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,70,_ctx);
}
}
}
catch (RecognitionException re) {
_localctx.exception = re;
_errHandler.reportError(this, re);
_errHandler.recover(this, re);
}
finally {
unrollRecursionContexts(_parentctx);
}
return _localctx;
}