/// <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)); }
/// <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 }); }
/// <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) { }
/// <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)); }