Пример #1
0
        public override Expression VisitPrimary_expression(Primary_expressionContext context)
        {
            var builder = new PrimaryExpressionBuilder(_parserContext);
            var pe      = context.pe;

            builder.Context(pe);
            if (pe is LiteralExpressionContext l)
            {
                var literalParser = new LiteralParser();
                var literal       = literalParser.Visit(l);
                builder.ExpressionStart(literal);
            }
            else if (pe is LiteralAccessExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=literal access", context);
            }
            else if (pe is SimpleNameExpressionContext sn)
            {
                var identifier = VisitIdentifier(sn.identifier());
                if (identifier != null)
                {
                    builder.ExpressionStart(identifier);
                }
                else
                {
                    if (sn.type_argument_list() != null)
                    {
                        throw new CompilationException("Unsupported expression. ExpressionType=type arguments", context);
                    }

                    builder.NamePart(sn.GetText());
                }
            }
            else if (pe is ParenthesisExpressionContext pre)
            {
                var innerExpression = Visit(pre.expression());
                builder.ExpressionStart(innerExpression);
            }
            else if (pe is ObjectCreationExpressionContext oce)
            {
                var typeName = oce.type().GetText();
                builder.TypeName(typeName);

                if (oce.object_creation_expression() != null ||
                    oce.object_or_collection_initializer() != null)
                {
                    var argList      = oce.object_creation_expression()?.argument_list();
                    var argumentList = ParseArgumentsList(argList);

                    var initializer = oce.object_or_collection_initializer()
                                      ?? oce.object_creation_expression()?.object_or_collection_initializer();
                    var initList = initializer
                                   ?.object_initializer()
                                   ?.member_initializer_list();
                    var bindingList = ParseBindingList(builder, initList);

                    var ctor = builder.Constructor(argumentList);
                    builder.MemberInit(ctor, bindingList);
                }
                else
                {
                    throw new CompilationException("Unsupported expression. ExpressionType=object creation", context);
                }
            }
            else if (pe is MemberAccessExpressionContext pt)
            {
                builder.NamePart(pt.GetText());
            }
            else if (pe is ThisReferenceExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=this reference", context);
            }
            else if (pe is BaseAccessExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=base access", context);
            }
            else if (pe is TypeofExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=typeof", context);
            }
            else if (pe is SizeofExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=sizeof", context);
            }
            else if (pe is NameofExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=nameof", context);
            }
            else if (pe is CheckedExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=checked", context);
            }
            else if (pe is UncheckedExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=unchecked", context);
            }
            else if (pe is DefaultValueExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=default", context);
            }
            else if (pe is AnonymousMethodExpressionContext)
            {
                throw new CompilationException("Unsupported expression. ExpressionType=anonymous method", context);
            }
            else
            {
                throw new CompilationException("Unsupported expression", context);
            }

            foreach (var child in context.children.Skip(1))
            {
                builder.Context(child);
                if (child is Member_accessContext)
                {
                    var memberName = child.GetText().TrimStart('.');
                    builder.Member(memberName);
                }
                else if (child is Method_invocationContext mi)
                {
                    var argumentsList = ParseArgumentsList(mi.argument_list());
                    builder.Method(argumentsList);
                }
                else if (child is Bracket_expressionContext be)
                {
                    var indexList = new List <Expression>();
                    foreach (var indexContext in be.indexer_argument())
                    {
                        var index = Visit(indexContext);
                        indexList.Add(index);
                    }
                    builder.Index(indexList);
                }
                else if (child is ITerminalNode tn)
                {
                    var op = tn.Symbol.Text; //++, --
                    throw new CompilationException($"Unsupported operation. Operation={op}", context);
                }
                else
                {
                    throw new CompilationException("Unsupported expression", context);
                }
            }

            var expression = builder.GetExpression();

            return(expression);
        }
Пример #2
0
	public Primary_expressionContext primary_expression() {
		Primary_expressionContext _localctx = new Primary_expressionContext(_ctx, State);
		EnterRule(_localctx, 84, RULE_primary_expression);
		try {
			State = 616;
			switch ( Interpreter.AdaptivePredict(_input,50,_ctx) ) {
			case 1:
				EnterOuterAlt(_localctx, 1);
				{
				State = 599; Match(IDENTIFIER);
				}
				break;

			case 2:
				EnterOuterAlt(_localctx, 2);
				{
				State = 600; constant();
				}
				break;

			case 3:
				EnterOuterAlt(_localctx, 3);
				{
				State = 601; Match(STRING_LITERAL);
				}
				break;

			case 4:
				EnterOuterAlt(_localctx, 4);
				{
				{
				State = 602; Match(LPAREN);
				State = 603; expression();
				State = 604; Match(RPAREN);
				}
				}
				break;

			case 5:
				EnterOuterAlt(_localctx, 5);
				{
				State = 606; Match(SELF);
				}
				break;

			case 6:
				EnterOuterAlt(_localctx, 6);
				{
				State = 607; Match(SUPER);
				}
				break;

			case 7:
				EnterOuterAlt(_localctx, 7);
				{
				State = 608; message_expression();
				}
				break;

			case 8:
				EnterOuterAlt(_localctx, 8);
				{
				State = 609; selector_expression();
				}
				break;

			case 9:
				EnterOuterAlt(_localctx, 9);
				{
				State = 610; protocol_expression();
				}
				break;

			case 10:
				EnterOuterAlt(_localctx, 10);
				{
				State = 611; encode_expression();
				}
				break;

			case 11:
				EnterOuterAlt(_localctx, 11);
				{
				State = 612; dictionary_expression();
				}
				break;

			case 12:
				EnterOuterAlt(_localctx, 12);
				{
				State = 613; array_expression();
				}
				break;

			case 13:
				EnterOuterAlt(_localctx, 13);
				{
				State = 614; box_expression();
				}
				break;

			case 14:
				EnterOuterAlt(_localctx, 14);
				{
				State = 615; block_expression();
				}
				break;
			}
		}
		catch (RecognitionException re) {
			_localctx.exception = re;
			_errHandler.ReportError(this, re);
			_errHandler.Recover(this, re);
		}
		finally {
			ExitRule();
		}
		return _localctx;
	}