/// <summary>
 /// Visit a parse tree produced by <see cref="Z80AsmParser.literalExpr"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitLiteralExpr([NotNull] Z80AsmParser.LiteralExprContext context)
 {
     return(VisitChildren(context));
 }
Example #2
0
        /// <summary>
        /// Visit a parse tree produced by <see cref="Generated.Z80AsmParser.literalExpr"/>.
        /// </summary>
        /// <param name="context">The parse tree.</param>
        /// <return>The visitor result.</return>
        public override object VisitLiteralExpr(Z80AsmParser.LiteralExprContext context)
        {
            if (IsInvalidContext(context))
            {
                return(null);
            }

            var token = context.NormalizeToken();

            if (token == "$")
            {
                return(new CurrentAddressNode());
            }

            ushort value;

            // --- Hexadecimal literals
            if (token.StartsWith("#"))
            {
                _numbers.Add(new TextSpan(context.Start.StartIndex, context.Start.StopIndex + 1));
                value = ushort.Parse(token.Substring(1), NumberStyles.HexNumber);
            }
            else if (token.StartsWith("0X"))
            {
                _numbers.Add(new TextSpan(context.Start.StartIndex, context.Start.StopIndex + 1));
                value = ushort.Parse(token.Substring(2), NumberStyles.HexNumber);
            }
            else if (token.EndsWith("H", StringComparison.OrdinalIgnoreCase))
            {
                _numbers.Add(new TextSpan(context.Start.StartIndex, context.Start.StopIndex + 1));
                value = (ushort)int.Parse(token.Substring(0, token.Length - 1),
                                          NumberStyles.HexNumber);
            }
            // --- Binary literals
            else if (token.StartsWith("%"))
            {
                _numbers.Add(new TextSpan(context.Start.StartIndex, context.Start.StopIndex + 1));
                value = (ushort)Convert.ToInt32(token.Substring(1).Replace("_", ""), 2);
            }
            else if (token.StartsWith("0B"))
            {
                _numbers.Add(new TextSpan(context.Start.StartIndex, context.Start.StopIndex + 1));
                value = (ushort)Convert.ToInt32(token.Substring(2).Replace("_", ""), 2);
            }
            // --- Character literals
            else if (token.StartsWith("\""))
            {
                var charExpr = context.GetText();
                var bytes    = Z80Assembler.SpectrumStringToBytes(charExpr.Substring(1, charExpr.Length - 2));
                value = bytes.Count == 0 ? (ushort)0x00 : bytes[0];
            }
            // --- Decimal literals
            else
            {
                _numbers.Add(new TextSpan(context.Start.StartIndex, context.Start.StopIndex + 1));
                value = (ushort)int.Parse(context.NormalizeToken());
            }
            return(new LiteralNode
            {
                LiteralValue = value
            });
        }
Example #3
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="Z80AsmParser.literalExpr"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitLiteralExpr([NotNull] Z80AsmParser.LiteralExprContext context)
 {
 }
Example #4
0
        /// <summary>
        /// Visit a parse tree produced by <see cref="Generated.Z80AsmParser.literalExpr"/>.
        /// </summary>
        /// <param name="context">The parse tree.</param>
        /// <return>The visitor result.</return>
        public override object VisitLiteralExpr(Z80AsmParser.LiteralExprContext context)
        {
            var token = context.NormalizeToken();

            if (context.CURADDR() != null || context.MULOP() != null || context.DOT() != null)
            {
                AddSemiVar(context);
                return(new CurrentAddressNode());
            }

            if (context.CURCNT() != null)
            {
                AddSemiVar(context);
                return(new CurrentLoopCounterNode());
            }

            // --- Check for Boolean values
            if (context.BOOLLIT() != null)
            {
                AddNumber(context);
                var boolValue = new ExpressionValue(context.BOOLLIT().GetText().ToLower().Contains("t"));
                return(new LiteralNode(boolValue));
            }

            // --- Check for real values
            if (context.REALNUM() != null)
            {
                AddNumber(context);
                return(double.TryParse(context.REALNUM().GetText(), out var realValue)
                    ? new LiteralNode(realValue)
                    : new LiteralNode(ExpressionValue.Error));
            }

            // --- Check for string values
            if (context.STRING() != null)
            {
                AddString(context);
                var stringValue = context.STRING().NormalizeString();
                return(new LiteralNode(stringValue));
            }

            ushort value;

            // --- Hexadecimal literals
            if (token.StartsWith("#"))
            {
                AddNumber(context);
                value = ushort.Parse(token.Substring(1), NumberStyles.HexNumber);
            }
            else if (token.StartsWith("0X"))
            {
                AddNumber(context);
                value = ushort.Parse(token.Substring(2), NumberStyles.HexNumber);
            }
            else if (token.StartsWith("$"))
            {
                AddNumber(context);
                value = ushort.Parse(token.Substring(1), NumberStyles.HexNumber);
            }
            else if (token.EndsWith("H", StringComparison.OrdinalIgnoreCase))
            {
                AddNumber(context);
                value = (ushort)int.Parse(token.Substring(0, token.Length - 1),
                                          NumberStyles.HexNumber);
            }
            // --- Binary literals
            else if (token.StartsWith("%"))
            {
                AddNumber(context);
                value = (ushort)Convert.ToInt32(token.Substring(1).Replace("_", ""), 2);
            }
            else if (token.StartsWith("0B"))
            {
                AddNumber(context);
                value = (ushort)Convert.ToInt32(token.Substring(2).Replace("_", ""), 2);
            }
            else if (token.EndsWith("b") || token.EndsWith("B"))
            {
                AddNumber(context);
                value = (ushort)Convert.ToInt32(token.Substring(0, token.Length - 1).Replace("_", ""), 2);
            }
            // --- Octal literals
            else if (token.EndsWith("q") || token.EndsWith("Q") || token.EndsWith("o") || token.EndsWith("O"))
            {
                AddNumber(context);
                value = (ushort)Convert.ToInt32(token.Substring(0, token.Length - 1), 8);
            }
            // --- Character literals
            else if (token.StartsWith("\"") || token.StartsWith("'"))
            {
                AddString(context);
                var charExpr = context.GetText();
                var bytes    = Z80Assembler.SpectrumStringToBytes(charExpr.Substring(1, charExpr.Length - 2));
                value = bytes.Count == 0 ? (ushort)0x00 : bytes[0];
            }
            // --- Decimal literals
            else
            {
                AddNumber(context);
                value = (ushort)int.Parse(context.NormalizeToken());
            }

            return(new LiteralNode(value));
        }