From 45f55f94cd0ee7fd28dacd89d77d530ee9d2b7e9 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Tue, 21 Jan 2025 22:10:50 +0800 Subject: [PATCH] part 2 --- .gitignore | 1 + .../ScriptEmitTest.cs | 35 +++-- .../AttackSymbol.cs | 8 +- .../BurstSymbol.cs | 8 +- .../ChargeSymbol.cs | 8 +- .../DashSymbol.cs | 8 +- .../ISymbolEmitter.cs | 2 + .../InstructionSymbol.cs | 21 ++- .../JumpSymbol.cs | 8 +- .../SkillSymbol.cs | 8 +- .../SpaceTriviaSymbol.cs | 14 +- ...faultSymbolEmitter.cs => SymbolEmitter.cs} | 8 +- .../SymbolParser.cs | 130 +++++++++++++++++- .../WaitSymbol.cs | 4 +- .../WalkSymbol.cs | 12 +- 15 files changed, 217 insertions(+), 58 deletions(-) rename BetterGenshinImpact.CombatScript/{DefaultSymbolEmitter.cs => SymbolEmitter.cs} (73%) diff --git a/.gitignore b/.gitignore index 6c21f5d7..358ec4fa 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ node_modules/ # Rider .idea +_ReSharper.Caches/ diff --git a/BetterGenshinImpact.CombatScript.Test/ScriptEmitTest.cs b/BetterGenshinImpact.CombatScript.Test/ScriptEmitTest.cs index 21821434..0cc2a5e2 100644 --- a/BetterGenshinImpact.CombatScript.Test/ScriptEmitTest.cs +++ b/BetterGenshinImpact.CombatScript.Test/ScriptEmitTest.cs @@ -12,34 +12,41 @@ public sealed class ScriptEmitTest new LineBreakTriviaSymbol(), new AvatarInstructionListSymbol(new("钟离"), [new SpaceTriviaSymbol()], new( [ - new WalkSymbol(WalkDirection.Backward, [new DoubleSymbol(0.1)], [new CommaTriviaSymbol()]), - new SkillSymbol(true, [new HoldSymbol()], [new CommaTriviaSymbol()]), - new WaitSymbol([new DoubleSymbol(0.3)], [new CommaTriviaSymbol()]), - new WalkSymbol(WalkDirection.Forward, [new DoubleSymbol(0.1)], []), + new WalkSymbol(WalkDirection.Backward, [new DoubleSymbol(0.1)], [], new CommaTriviaSymbol()), + new SkillSymbol(true, [new HoldSymbol()], [new SpaceTriviaSymbol()], new CommaTriviaSymbol()), + new WaitSymbol([new DoubleSymbol(0.3)], [new SpaceTriviaSymbol()], new CommaTriviaSymbol()), + new WalkSymbol(WalkDirection.Forward, [new DoubleSymbol(0.1)], [new SpaceTriviaSymbol()], default), ])), new LineBreakTriviaSymbol(), new AvatarInstructionListSymbol(new("芙宁娜"), [new SpaceTriviaSymbol()], new( [ - new SkillSymbol(true, [new CommaTriviaSymbol()]), - new BurstSymbol(true, []) + new SkillSymbol(true, [], new CommaTriviaSymbol()), + new BurstSymbol(true, [new SpaceTriviaSymbol()], default) ])), new LineBreakTriviaSymbol(), new AvatarInstructionListSymbol(new("行秋"), [new SpaceTriviaSymbol()], new( [ - new SkillSymbol(true, [new CommaTriviaSymbol()]), - new BurstSymbol(true, [new CommaTriviaSymbol()]), - new SkillSymbol(true, []), + new SkillSymbol(true, [], new CommaTriviaSymbol()), + new BurstSymbol(true, [new SpaceTriviaSymbol()], new CommaTriviaSymbol()), + new SkillSymbol(true, [new SpaceTriviaSymbol()], default), ])), ]); - Console.WriteLine(scriptUnit.Emit(new DefaultSymbolEmitter())); + Console.WriteLine(scriptUnit.Emit(new SymbolEmitter())); } [TestMethod] - public void Test() + public void TestParse() { - ReadOnlySpan raw = "ABCDEF;GHIJKL\r\nMNOPQR\nSTUVWX\rYZ\r\n"; - SymbolParser parser = new(); - ScriptUnit scriptUnit = parser.Parse(raw); + ReadOnlySpan raw = """ + // 测试注释 + 钟离 s(0.1),e(hold),wait(0.3),w(0.1) + 芙宁娜 e,q + + 行秋 e,q,e + """; + ScriptUnit scriptUnit = SymbolParser.Parse(raw); + + Console.WriteLine(scriptUnit.Emit(new SymbolEmitter())); } } \ No newline at end of file diff --git a/BetterGenshinImpact.CombatScript/AttackSymbol.cs b/BetterGenshinImpact.CombatScript/AttackSymbol.cs index 115022e9..c4ea1b8d 100644 --- a/BetterGenshinImpact.CombatScript/AttackSymbol.cs +++ b/BetterGenshinImpact.CombatScript/AttackSymbol.cs @@ -5,8 +5,8 @@ namespace BetterGenshinImpact.CombatScript; public class AttackSymbol : InstructionSymbol, IInstructionSymbolHasDuration { - public AttackSymbol(ImmutableArray parameterList, ImmutableArray trivia) - : base("attack", parameterList, trivia) + public AttackSymbol(ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("attack", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [0, 1]); @@ -20,8 +20,8 @@ public class AttackSymbol : InstructionSymbol, IInstructionSymbolHasDuration } } - public AttackSymbol(ImmutableArray trivia) - : base("attack", trivia) + public AttackSymbol(ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("attack", leadingTriviaList, tailingTrivia) { } diff --git a/BetterGenshinImpact.CombatScript/BurstSymbol.cs b/BetterGenshinImpact.CombatScript/BurstSymbol.cs index 9843d244..07a71ba1 100644 --- a/BetterGenshinImpact.CombatScript/BurstSymbol.cs +++ b/BetterGenshinImpact.CombatScript/BurstSymbol.cs @@ -4,8 +4,8 @@ namespace BetterGenshinImpact.CombatScript; public class BurstSymbol : InstructionSymbol, IInstructionSymbolHasAlias { - public BurstSymbol(bool isAlias, ImmutableArray parameterList, ImmutableArray trivia) - : base("burst", parameterList, trivia) + public BurstSymbol(bool isAlias, ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("burst", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [0]); @@ -13,8 +13,8 @@ public class BurstSymbol : InstructionSymbol, IInstructionSymbolHasAlias IsAlias = isAlias; } - public BurstSymbol(bool isAlias, ImmutableArray trivia) - : base("burst", trivia) + public BurstSymbol(bool isAlias, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("burst", leadingTriviaList, tailingTrivia) { IsAlias = isAlias; } diff --git a/BetterGenshinImpact.CombatScript/ChargeSymbol.cs b/BetterGenshinImpact.CombatScript/ChargeSymbol.cs index b30611c2..a66707ea 100644 --- a/BetterGenshinImpact.CombatScript/ChargeSymbol.cs +++ b/BetterGenshinImpact.CombatScript/ChargeSymbol.cs @@ -5,8 +5,8 @@ namespace BetterGenshinImpact.CombatScript; public class ChargeSymbol : InstructionSymbol, IInstructionSymbolHasDuration { - public ChargeSymbol(ImmutableArray parameterList, ImmutableArray trivia) - : base("charge", parameterList, trivia) + public ChargeSymbol(ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("charge", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [0, 1]); @@ -20,8 +20,8 @@ public class ChargeSymbol : InstructionSymbol, IInstructionSymbolHasDuration } } - public ChargeSymbol(ImmutableArray trivia) - : base("charge", trivia) + public ChargeSymbol(ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("charge", leadingTriviaList, tailingTrivia) { } diff --git a/BetterGenshinImpact.CombatScript/DashSymbol.cs b/BetterGenshinImpact.CombatScript/DashSymbol.cs index c8f8549f..f4d68180 100644 --- a/BetterGenshinImpact.CombatScript/DashSymbol.cs +++ b/BetterGenshinImpact.CombatScript/DashSymbol.cs @@ -5,8 +5,8 @@ namespace BetterGenshinImpact.CombatScript; public class DashSymbol : InstructionSymbol, IInstructionSymbolHasDuration { - public DashSymbol(ImmutableArray parameterList, ImmutableArray trivia) - : base("dash", parameterList, trivia) + public DashSymbol(ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("dash", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [0, 1]); @@ -20,8 +20,8 @@ public class DashSymbol : InstructionSymbol, IInstructionSymbolHasDuration } } - public DashSymbol(ImmutableArray trivia) - : base("dash", trivia) + public DashSymbol(ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("dash", leadingTriviaList, tailingTrivia) { } diff --git a/BetterGenshinImpact.CombatScript/ISymbolEmitter.cs b/BetterGenshinImpact.CombatScript/ISymbolEmitter.cs index 5706faa3..ec3a883e 100644 --- a/BetterGenshinImpact.CombatScript/ISymbolEmitter.cs +++ b/BetterGenshinImpact.CombatScript/ISymbolEmitter.cs @@ -6,6 +6,8 @@ public interface ISymbolEmitter ISymbolEmitter Append(char value); + ISymbolEmitter Append(char value, int repeatCount); + ISymbolEmitter Append(double value); ISymbolEmitter Append(string value); diff --git a/BetterGenshinImpact.CombatScript/InstructionSymbol.cs b/BetterGenshinImpact.CombatScript/InstructionSymbol.cs index a6662ace..74bd4a3d 100644 --- a/BetterGenshinImpact.CombatScript/InstructionSymbol.cs +++ b/BetterGenshinImpact.CombatScript/InstructionSymbol.cs @@ -4,19 +4,21 @@ namespace BetterGenshinImpact.CombatScript; public abstract class InstructionSymbol : BaseSymbol { - protected InstructionSymbol(string name, ImmutableArray trivia) + protected InstructionSymbol(string name, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) { Name = name; HasParameterList = false; - TriviaList = trivia; + LeadingTriviaList = leadingTriviaList; + TailingTrivia = tailingTrivia; } - protected InstructionSymbol(string name, ImmutableArray parameterList, ImmutableArray trivia) + protected InstructionSymbol(string name, ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) { Name = name; HasParameterList = true; ParameterList = parameterList; - TriviaList = trivia; + LeadingTriviaList = leadingTriviaList; + TailingTrivia = tailingTrivia; } public string Name { get; } @@ -25,10 +27,14 @@ public abstract class InstructionSymbol : BaseSymbol public ImmutableArray ParameterList { get; } - public ImmutableArray TriviaList { get; } + public ImmutableArray LeadingTriviaList { get; } + + public TriviaSymbol? TailingTrivia { get; set; } public override void Emit(ISymbolEmitter emitter) { + emitter.Append(LeadingTriviaList); + if (this is IInstructionSymbolHasAlias {IsAlias: true } hasAlias) { emitter.Append(hasAlias.AliasName); @@ -45,6 +51,9 @@ public abstract class InstructionSymbol : BaseSymbol emitter.Append(')'); } - emitter.Append(TriviaList); + if (TailingTrivia is not null) + { + emitter.Append(TailingTrivia); + } } } \ No newline at end of file diff --git a/BetterGenshinImpact.CombatScript/JumpSymbol.cs b/BetterGenshinImpact.CombatScript/JumpSymbol.cs index cbbc3149..9b20ace6 100644 --- a/BetterGenshinImpact.CombatScript/JumpSymbol.cs +++ b/BetterGenshinImpact.CombatScript/JumpSymbol.cs @@ -4,8 +4,8 @@ namespace BetterGenshinImpact.CombatScript; public class JumpSymbol : InstructionSymbol, IInstructionSymbolHasAlias { - public JumpSymbol(bool isAlias, ImmutableArray parameterList, ImmutableArray trivia) - : base("jump", parameterList, trivia) + public JumpSymbol(bool isAlias, ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("jump", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [0]); @@ -13,8 +13,8 @@ public class JumpSymbol : InstructionSymbol, IInstructionSymbolHasAlias IsAlias = isAlias; } - public JumpSymbol(bool isAlias, ImmutableArray trivia) - : base("jump", trivia) + public JumpSymbol(bool isAlias, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("jump", leadingTriviaList, tailingTrivia) { IsAlias = isAlias; } diff --git a/BetterGenshinImpact.CombatScript/SkillSymbol.cs b/BetterGenshinImpact.CombatScript/SkillSymbol.cs index d554df7a..f4bf3d8e 100644 --- a/BetterGenshinImpact.CombatScript/SkillSymbol.cs +++ b/BetterGenshinImpact.CombatScript/SkillSymbol.cs @@ -4,8 +4,8 @@ namespace BetterGenshinImpact.CombatScript; public class SkillSymbol : InstructionSymbol, IInstructionSymbolHasAlias { - public SkillSymbol(bool isAlias, ImmutableArray parameterList, ImmutableArray trivia) - : base("skill", parameterList, trivia) + public SkillSymbol(bool isAlias, ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("skill", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [0, 1]); @@ -18,8 +18,8 @@ public class SkillSymbol : InstructionSymbol, IInstructionSymbolHasAlias IsAlias = isAlias; } - public SkillSymbol(bool isAlias, ImmutableArray trivia) - : base("skill", trivia) + public SkillSymbol(bool isAlias, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("skill", leadingTriviaList, tailingTrivia) { IsAlias = isAlias; } diff --git a/BetterGenshinImpact.CombatScript/SpaceTriviaSymbol.cs b/BetterGenshinImpact.CombatScript/SpaceTriviaSymbol.cs index 13e0d33b..f6190617 100644 --- a/BetterGenshinImpact.CombatScript/SpaceTriviaSymbol.cs +++ b/BetterGenshinImpact.CombatScript/SpaceTriviaSymbol.cs @@ -2,8 +2,20 @@ public class SpaceTriviaSymbol : TriviaSymbol { + private readonly int count; + + public SpaceTriviaSymbol() + { + count = 1; + } + + public SpaceTriviaSymbol(int count) + { + this.count = count; + } + public override void Emit(ISymbolEmitter emitter) { - emitter.Append(' '); + emitter.Append(' ', count); } } \ No newline at end of file diff --git a/BetterGenshinImpact.CombatScript/DefaultSymbolEmitter.cs b/BetterGenshinImpact.CombatScript/SymbolEmitter.cs similarity index 73% rename from BetterGenshinImpact.CombatScript/DefaultSymbolEmitter.cs rename to BetterGenshinImpact.CombatScript/SymbolEmitter.cs index 03d833f1..56240416 100644 --- a/BetterGenshinImpact.CombatScript/DefaultSymbolEmitter.cs +++ b/BetterGenshinImpact.CombatScript/SymbolEmitter.cs @@ -2,7 +2,7 @@ namespace BetterGenshinImpact.CombatScript; -public sealed class DefaultSymbolEmitter : ISymbolEmitter +public sealed class SymbolEmitter : ISymbolEmitter { private readonly StringBuilder builder = new(); @@ -16,6 +16,12 @@ public sealed class DefaultSymbolEmitter : ISymbolEmitter builder.Append(value); return this; } + + public ISymbolEmitter Append(char value, int repeatCount) + { + builder.Append(value, repeatCount); + return this; + } public ISymbolEmitter Append(double value) { diff --git a/BetterGenshinImpact.CombatScript/SymbolParser.cs b/BetterGenshinImpact.CombatScript/SymbolParser.cs index eee39f30..fbd66c91 100644 --- a/BetterGenshinImpact.CombatScript/SymbolParser.cs +++ b/BetterGenshinImpact.CombatScript/SymbolParser.cs @@ -4,16 +4,16 @@ using System.Runtime.CompilerServices; namespace BetterGenshinImpact.CombatScript; -public sealed class SymbolParser +public static class SymbolParser { - public ScriptUnit Parse(ReadOnlySpan raw) + public static ScriptUnit Parse(ReadOnlySpan raw) { ImmutableArray.Builder symbols = ImmutableArray.CreateBuilder(); ParseLines(raw, symbols); return new(symbols.ToImmutable()); } - private void ParseLines(ReadOnlySpan raw, ImmutableArray.Builder symbols) + private static void ParseLines(ReadOnlySpan raw, ImmutableArray.Builder symbols) { bool skipNextRange = false; ref readonly char end = ref raw[^1]; @@ -63,9 +63,131 @@ public sealed class SymbolParser throw new InvalidOperationException($"Failed to parse line break trivia at {range}."); } - ReadOnlySpan currentSpan = raw[range]; + if (ParseLine(raw[range]) is { } symbol) + { + symbols.Add(symbol); + } symbols.Add(lineBreakTrivia); } } + + private static ISymbol? ParseLine(ReadOnlySpan raw) + { + if (raw.IsEmpty) + { + return default; + } + + if (raw.StartsWith("//")) + { + return new CommentSymbol(raw[2..].ToString()); + } + + int indexOfSpace = raw.IndexOf(' '); + ReadOnlySpan avatarIdentifier = raw[..indexOfSpace]; + AvatarSymbol avatarSymbol = new(avatarIdentifier.ToString()); + ImmutableArray triviaList = ParseTriviaList(raw[indexOfSpace..], out int advanced); + InstructionListSymbol listSymbol = ParseInstructionList(raw[(indexOfSpace + advanced)..]); + return new AvatarInstructionListSymbol(avatarSymbol, triviaList, listSymbol); + } + + private static InstructionListSymbol ParseInstructionList(ReadOnlySpan raw) + { + ImmutableArray.Builder builder = ImmutableArray.CreateBuilder(); + + foreach (Range range in raw.Split(',')) + { + ReadOnlySpan current = raw[range]; + ImmutableArray leadingTriviaList = ParseTriviaList(current, out int advanced); + + if (ParseInstruction(current[advanced..], leadingTriviaList) is { } symbol) + { + builder.Add(symbol); + } + } + + return new(builder.ToImmutable()); + } + + private static InstructionSymbol? ParseInstruction(ReadOnlySpan raw, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + { + if (raw.IsEmpty) + { + return default; + } + + switch (raw[0]) + { + // attack|a + case 'a': + break; + // burst + case 'b': + return new BurstSymbol(false, [], leadingTriviaList, tailingTrivia); + break; + // charge + case 'c': + break; + // dash|d + case 'd': + break; + // jump|j + case 'j': + break; + // q + case 'q': + return new BurstSymbol(true, [], leadingTriviaList, tailingTrivia); + break; + // skill|s + case 's': + break; + // wait|walk|w + case 'w': + break; + } + + return default; + } + + // Handle ','&' ' + private static ImmutableArray ParseTriviaList(ReadOnlySpan raw, out int advanced) + { + advanced = 0; + if (raw.IsEmpty) + { + return ImmutableArray.Empty; + } + + ImmutableArray.Builder builder = ImmutableArray.CreateBuilder(); + + int spaceCount = 0; + foreach (ref readonly char value in raw) + { + advanced++; + if (value is ' ') + { + spaceCount++; + } + else + { + if (spaceCount is not 0) + { + builder.Add(new SpaceTriviaSymbol(spaceCount)); + spaceCount = 0; + } + + if (value is ',') + { + builder.Add(new CommaTriviaSymbol()); + } + else + { + break; + } + } + } + + return builder.ToImmutable(); + } } \ No newline at end of file diff --git a/BetterGenshinImpact.CombatScript/WaitSymbol.cs b/BetterGenshinImpact.CombatScript/WaitSymbol.cs index 40161a6a..cdd8a3e0 100644 --- a/BetterGenshinImpact.CombatScript/WaitSymbol.cs +++ b/BetterGenshinImpact.CombatScript/WaitSymbol.cs @@ -5,8 +5,8 @@ namespace BetterGenshinImpact.CombatScript; public class WaitSymbol : InstructionSymbol, IInstructionSymbolHasDuration { - public WaitSymbol(ImmutableArray parameterList, ImmutableArray trivia) - : base("wait", parameterList, trivia) + public WaitSymbol(ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("wait", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [1]); diff --git a/BetterGenshinImpact.CombatScript/WalkSymbol.cs b/BetterGenshinImpact.CombatScript/WalkSymbol.cs index 0cde969d..dc038e60 100644 --- a/BetterGenshinImpact.CombatScript/WalkSymbol.cs +++ b/BetterGenshinImpact.CombatScript/WalkSymbol.cs @@ -5,8 +5,8 @@ namespace BetterGenshinImpact.CombatScript; public class WalkSymbol : InstructionSymbol, IInstructionSymbolHasAlias, IInstructionSymbolHasDuration, IParameterSymbol { - public WalkSymbol(WalkDirection direction, ImmutableArray parameterList, ImmutableArray trivia) - : base("walk", parameterList, trivia) + public WalkSymbol(WalkDirection direction, ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("walk", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [1]); @@ -22,15 +22,15 @@ public class WalkSymbol : InstructionSymbol, IInstructionSymbolHasAlias, IInstru } // Used for parameter - public WalkSymbol(WalkDirection direction, ImmutableArray trivia) - : base("walk", trivia) + public WalkSymbol(WalkDirection direction, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("walk", leadingTriviaList, tailingTrivia) { Direction = direction; IsAlias = true; } - public WalkSymbol(ImmutableArray parameterList, ImmutableArray trivia) - : base("walk", parameterList, trivia) + public WalkSymbol(ImmutableArray parameterList, ImmutableArray leadingTriviaList, TriviaSymbol? tailingTrivia) + : base("walk", parameterList, leadingTriviaList, tailingTrivia) { InstructionThrowHelper.ThrowIfParameterListIsDefault(parameterList); InstructionThrowHelper.ThrowIfParameterListCountNotCorrect(parameterList, [2]);