diff --git a/samples/TinyC/Node.cs b/samples/TinyC/Node.cs index 709c864..b9ab3ff 100644 --- a/samples/TinyC/Node.cs +++ b/samples/TinyC/Node.cs @@ -32,7 +32,7 @@ static void Print(Node node, IndentedStringBuilder sb) break; case NumberNode(Value: var number): - sb.Append(number.ToString()); + sb.Append(number); break; case IfNode c: @@ -43,10 +43,10 @@ static void Print(Node node, IndentedStringBuilder sb) Print(c.IfTrue, sb); - if (c.IfFalse is BlockNode { Statements: [IfNode @else] }) + if (c.IfFalse is BlockNode { Statements: [IfNode ifElse] }) { sb.Append("else "); - Print(@else, sb); + Print(ifElse, sb); } else if (c.IfFalse is not BlockNode([])) { @@ -58,11 +58,17 @@ static void Print(Node node, IndentedStringBuilder sb) case TernaryNode c: Print(c.Test, sb); - sb.Append(" ? ("); + sb.IncrementIndent(); + sb + .AppendLine() + .Append("? "); Print(c.IfTrue, sb); - sb.Append(") : ("); + + sb + .AppendLine() + .Append(": "); Print(c.IfFalse, sb); - sb.Append(')'); + sb.DecrementIndent(); break; case WhileLoopNode w: @@ -88,6 +94,13 @@ static void Print(Node node, IndentedStringBuilder sb) sb.Append(')'); break; + case BinaryNode(Operator: "=", var variable, var expr): + Print(variable, sb); + sb.Append(" = ("); + Print(expr, sb); + sb.Append(')'); + break; + case BinaryNode b: sb.Append('('); Print(b.Left, sb); diff --git a/samples/Utilities/IndentedStringBuilder.cs b/samples/Utilities/IndentedStringBuilder.cs index 37b9d70..f523f0c 100644 --- a/samples/Utilities/IndentedStringBuilder.cs +++ b/samples/Utilities/IndentedStringBuilder.cs @@ -9,59 +9,45 @@ internal sealed class IndentedStringBuilder private readonly StringBuilder _sb = new StringBuilder(); - public int Length => _sb.Length; - - public IndentedStringBuilder Append(string value) + public IndentedStringBuilder Append(char value) { DoIndent(); _sb.Append(value); return this; } - public IndentedStringBuilder Append(FormattableString value) + public IndentedStringBuilder Append(int value) { DoIndent(); _sb.Append(value); return this; } - public IndentedStringBuilder Append(char value) + public IndentedStringBuilder Append(string value) { DoIndent(); _sb.Append(value); return this; } - public IndentedStringBuilder AppendLine() + public IndentedStringBuilder Append(FormattableString value) { - AppendLine(string.Empty); + DoIndent(); + _sb.Append(value); return this; } - public IndentedStringBuilder AppendLine(string value) + public IndentedStringBuilder AppendLine() { - if (value.Length != 0) - DoIndent(); - - _sb.AppendLine(value); - _indentPending = true; + AppendLine(string.Empty); return this; } - public IndentedStringBuilder AppendLine(FormattableString value) + public IndentedStringBuilder AppendLine(string value) { DoIndent(); - _sb.Append(value); - _indentPending = true; - return this; - } - - public IndentedStringBuilder Clear() - { - _sb.Clear(); + _sb.AppendLine(value); _indentPending = true; - _indent = 0; - return this; } @@ -73,37 +59,18 @@ public IndentedStringBuilder IncrementIndent() public IndentedStringBuilder DecrementIndent() { - if (_indent > 0) - _indent--; - + _indent = Math.Max(0, _indent - 1); return this; } - public IDisposable Indent() => - new Indenter(this); - public override string ToString() => _sb.ToString(); private void DoIndent() { - if (_indentPending && _indent > 0) + if (_indentPending && _indent != 0) _sb.Append(' ', _indent * 4); _indentPending = false; } - - private sealed class Indenter : IDisposable - { - private readonly IndentedStringBuilder _sb; - - public Indenter(IndentedStringBuilder sb) - { - _sb = sb; - _sb.IncrementIndent(); - } - - public void Dispose() => - _sb.DecrementIndent(); - } }