Example #1
0
        /// <summary>
        /// Visit a parse tree produced by <see cref="Generated.Z80AsmParser.operand"/>.
        /// </summary>
        /// <param name="context">The parse tree.</param>
        /// <return>The visitor result.</return>
        public override object VisitOperand(Z80AsmParser.OperandContext context)
        {
            if (IsInvalidContext(context))
            {
                return(null);
            }

            // --- The context has exactly one child
            var child = context.GetChild(0);
            var op    = new Operand();

            if (child is Z80AsmParser.Reg8Context)
            {
                op.Type     = OperandType.Reg8;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.Reg8IdxContext)
            {
                op.Type     = OperandType.Reg8Idx;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.Reg8SpecContext)
            {
                op.Type     = OperandType.Reg8Spec;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.Reg16Context)
            {
                op.Type     = OperandType.Reg16;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.Reg16IdxContext)
            {
                op.Type     = OperandType.Reg16Idx;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.Reg16SpecContext)
            {
                op.Type     = OperandType.Reg16Spec;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.MemIndirectContext)
            {
                var expContext = child.GetChild(1) as Z80AsmParser.ExprContext;
                op.Type       = OperandType.MemIndirect;
                op.Expression = (ExpressionNode)VisitExpr(expContext);
            }
            else if (child is Z80AsmParser.RegIndirectContext)
            {
                op.Type     = OperandType.RegIndirect;
                op.Register = child.GetText().NormalizeToken();
            }
            else if (child is Z80AsmParser.CPortContext)
            {
                op.Type = OperandType.CPort;
            }
            else if (child is Z80AsmParser.IndexedAddrContext)
            {
                op.Type = OperandType.IndexedAddress;
                var indexedAddrContext = child as Z80AsmParser.IndexedAddrContext;
                if (indexedAddrContext.ChildCount > 3)
                {
                    op.Expression = indexedAddrContext.GetChild(3) is Z80AsmParser.LiteralExprContext
                        ? (ExpressionNode)VisitLiteralExpr(
                        indexedAddrContext.GetChild(3) as Z80AsmParser.LiteralExprContext)
                        : indexedAddrContext.GetChild(3).NormalizeToken() == "["
                            ? (ExpressionNode)VisitExpr(indexedAddrContext.GetChild(4) as Z80AsmParser.ExprContext)
                            : (ExpressionNode)VisitSymbolExpr(
                        indexedAddrContext.GetChild(3) as Z80AsmParser.SymbolExprContext);
                }
                op.Register = indexedAddrContext.GetChild(1).NormalizeToken();
                op.Sign     = indexedAddrContext.ChildCount > 3
                    ? indexedAddrContext.GetChild(2).NormalizeToken()
                    : null;
            }
            else if (child is Z80AsmParser.ExprContext)
            {
                op.Type       = OperandType.Expr;
                op.Expression = (ExpressionNode)VisitExpr(child as Z80AsmParser.ExprContext);
            }
            return(op);
        }