diff --git a/src/GDShrapt.Reader/GDScriptReader.cs b/src/GDShrapt.Reader/GDScriptReader.cs index 15a1444..61a2346 100644 --- a/src/GDShrapt.Reader/GDScriptReader.cs +++ b/src/GDShrapt.Reader/GDScriptReader.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.Linq; @@ -105,10 +106,11 @@ public GDStatement ParseStatement(string content) public List ParseUnspecifiedContent(string content) { - var state = new GDReadingState(Settings); + throw new NotImplementedException(); + /*var state = new GDReadingState(Settings); var receiver = new GDReceiver(); - state.Push(new GDContentResolver(receiver, 0)); + state.Push(new GDContentResolver(receiver)); var buffer = new char[Settings.ReadBufferSize]; int count = 0; @@ -120,7 +122,7 @@ public List ParseUnspecifiedContent(string content) } state.CompleteReading(); - return receiver.Tokens; + return receiver.Tokens;*/ } private void ParseBuffer(char[] buffer, int count, GDReadingState state) diff --git a/src/GDShrapt.Reader/Resolvers/GDContentResolver.cs b/src/GDShrapt.Reader/Resolvers/GDContentResolver.cs index d65fc02..b08c247 100644 --- a/src/GDShrapt.Reader/Resolvers/GDContentResolver.cs +++ b/src/GDShrapt.Reader/Resolvers/GDContentResolver.cs @@ -1,28 +1,86 @@ -namespace GDShrapt.Reader +using System.Text; + +namespace GDShrapt.Reader { - internal class GDContentResolver : GDIntendedResolver + internal class GDContentResolver : GDResolver { new IIntendedTokenReceiver Owner { get; } - public GDContentResolver(IIntendedTokenReceiver owner, int lineIntendation) - : base(owner, lineIntendation) + + readonly StringBuilder _sequence = new StringBuilder(); + + GDSpace _lastSpace; + + public GDContentResolver(IIntendedTokenReceiver owner) + : base(owner) { Owner = owner; } - internal override void HandleCharAfterIntendation(char c, GDReadingState state) + internal override void HandleChar(char c, GDReadingState state) { - throw new System.NotImplementedException(); + if (IsSpace(c)) + { + if (_sequence.Length == 0) + { + state.PushAndPass(_lastSpace = new GDSpace(), c); + } + else + { + HandleSequence(_sequence.ToString()); + } + } + else + { + //if (char. + + if (char.IsLetter(c)) + { + _sequence.Append(c); + return; + } + } } - internal override void HandleNewLineAfterIntendation(GDReadingState state) + private void HandleSequence(string seq) { - throw new System.NotImplementedException(); + } - internal override void HandleSharpCharAfterIntendation(GDReadingState state) + internal override void HandleNewLineChar(GDReadingState state) { - throw new System.NotImplementedException(); + if (_sequence.Length == 0) + { + if (_lastSpace != null) + { + Owner.HandleReceivedToken(_lastSpace); + _lastSpace = null; + } + + Owner.AddNewLine(); + } + else + { + HandleSequence(_sequence.ToString()); + } + } + + internal override void HandleSharpChar(GDReadingState state) + { + if (_sequence.Length == 0) + { + if (_lastSpace != null) + { + Owner.HandleReceivedToken(_lastSpace); + _lastSpace = null; + } + + Owner.HandleReceivedToken(state.PushAndPass(new GDComment(), '#')); + } + else + { + HandleSequence(_sequence.ToString()); + } } } } diff --git a/src/GDShrapt.Reader/Statements/GDForStatement.cs b/src/GDShrapt.Reader/Statements/GDForStatement.cs index 619ab3d..5bf532d 100644 --- a/src/GDShrapt.Reader/Statements/GDForStatement.cs +++ b/src/GDShrapt.Reader/Statements/GDForStatement.cs @@ -7,7 +7,8 @@ public sealed class GDForStatement : GDStatement, ITokenOrSkipReceiver, ITokenOrSkipReceiver, ITokenOrSkipReceiver, - ITokenOrSkipReceiver + ITokenOrSkipReceiver, + ITokenOrSkipReceiver { public GDForKeyword ForKeyword { @@ -272,5 +273,28 @@ void ITokenSkipReceiver.HandleReceivedTokenSkip() throw new GDInvalidStateException(); } + + void ITokenReceiver.HandleReceivedToken(GDStatementsList token) + { + if (_form.IsOrLowerState(State.Statements)) + { + Statements = token; + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } } } diff --git a/src/GDShrapt.Reader/Statements/GDIfStatement.cs b/src/GDShrapt.Reader/Statements/GDIfStatement.cs index c13b856..2fc4aa8 100644 --- a/src/GDShrapt.Reader/Statements/GDIfStatement.cs +++ b/src/GDShrapt.Reader/Statements/GDIfStatement.cs @@ -2,6 +2,7 @@ { public sealed class GDIfStatement : GDStatement, IIntendedTokenOrSkipReceiver, + IIntendedTokenOrSkipReceiver, IIntendedTokenOrSkipReceiver { bool _waitForEndLine = true; @@ -103,6 +104,7 @@ void ITokenReceiver.HandleReceivedToken(GDIfBranch token) if (_form.IsOrLowerState(State.IfBranch)) { IfBranch = token; + _form.State = State.ElifBranches; return; } @@ -112,7 +114,33 @@ void ITokenReceiver.HandleReceivedToken(GDIfBranch token) void ITokenSkipReceiver.HandleReceivedTokenSkip() { if (_form.IsOrLowerState(State.IfBranch)) + { + _form.State = State.ElifBranches; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenReceiver.HandleReceivedToken(GDElifBranchesList token) + { + if (_form.IsOrLowerState(State.ElifBranches)) + { + ElifBranchesList = token; + _form.State = State.ElseBranch; return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.ElifBranches)) + { + _form.State = State.ElseBranch; + return; + } throw new GDInvalidStateException(); } diff --git a/src/GDShrapt.Reader/Statements/GDMatchStatement.cs b/src/GDShrapt.Reader/Statements/GDMatchStatement.cs index 68d8e4e..bc48eea 100644 --- a/src/GDShrapt.Reader/Statements/GDMatchStatement.cs +++ b/src/GDShrapt.Reader/Statements/GDMatchStatement.cs @@ -3,7 +3,8 @@ public sealed class GDMatchStatement : GDStatement, ITokenOrSkipReceiver, ITokenOrSkipReceiver, - ITokenOrSkipReceiver + ITokenOrSkipReceiver, + ITokenOrSkipReceiver { public GDMatchKeyword MatchKeyword { @@ -169,5 +170,28 @@ void ITokenSkipReceiver.HandleReceivedTokenSkip() throw new GDInvalidStateException(); } + + void ITokenReceiver.HandleReceivedToken(GDMatchCasesList token) + { + if (_form.IsOrLowerState(State.Cases)) + { + Cases = token; + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.Cases)) + { + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } } } \ No newline at end of file diff --git a/src/GDShrapt.Reader/Statements/GDWhileStatement.cs b/src/GDShrapt.Reader/Statements/GDWhileStatement.cs index bbb8753..2488314 100644 --- a/src/GDShrapt.Reader/Statements/GDWhileStatement.cs +++ b/src/GDShrapt.Reader/Statements/GDWhileStatement.cs @@ -4,7 +4,8 @@ namespace GDShrapt.Reader public sealed class GDWhileStatement : GDStatement, ITokenOrSkipReceiver, ITokenOrSkipReceiver, - ITokenOrSkipReceiver + ITokenOrSkipReceiver, + ITokenOrSkipReceiver { public GDWhileKeyword WhileKeyword { @@ -196,5 +197,28 @@ void ITokenSkipReceiver.HandleReceivedTokenSkip() throw new GDInvalidStateException(); } + + void ITokenReceiver.HandleReceivedToken(GDStatementsList token) + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + Statements = token; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } } } diff --git a/src/GDShrapt.Reader/Statements/IfStatement/GDElifBranch.cs b/src/GDShrapt.Reader/Statements/IfStatement/GDElifBranch.cs index acc950b..ce17a41 100644 --- a/src/GDShrapt.Reader/Statements/IfStatement/GDElifBranch.cs +++ b/src/GDShrapt.Reader/Statements/IfStatement/GDElifBranch.cs @@ -3,7 +3,8 @@ public sealed class GDElifBranch : GDNode, ITokenOrSkipReceiver, ITokenOrSkipReceiver, - ITokenOrSkipReceiver + ITokenOrSkipReceiver, + ITokenOrSkipReceiver { public GDElifKeyword ElifKeyword { @@ -188,5 +189,28 @@ void ITokenSkipReceiver.HandleReceivedTokenSkip() throw new GDInvalidStateException(); } + + void ITokenReceiver.HandleReceivedToken(GDStatementsList token) + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + Statements = token; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } } } diff --git a/src/GDShrapt.Reader/Statements/IfStatement/GDElseBranch.cs b/src/GDShrapt.Reader/Statements/IfStatement/GDElseBranch.cs index 6ed27aa..95528d7 100644 --- a/src/GDShrapt.Reader/Statements/IfStatement/GDElseBranch.cs +++ b/src/GDShrapt.Reader/Statements/IfStatement/GDElseBranch.cs @@ -3,7 +3,8 @@ public sealed class GDElseBranch : GDNode, ITokenOrSkipReceiver, ITokenOrSkipReceiver, - ITokenOrSkipReceiver + ITokenOrSkipReceiver, + ITokenOrSkipReceiver { public GDElseKeyword ElseKeyword { @@ -166,5 +167,28 @@ void ITokenSkipReceiver.HandleReceivedTokenSkip() throw new GDInvalidStateException(); } + + void ITokenReceiver.HandleReceivedToken(GDStatementsList token) + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + Statements = token; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } } } diff --git a/src/GDShrapt.Reader/Statements/IfStatement/GDIfBranch.cs b/src/GDShrapt.Reader/Statements/IfStatement/GDIfBranch.cs index 70a85c4..125e747 100644 --- a/src/GDShrapt.Reader/Statements/IfStatement/GDIfBranch.cs +++ b/src/GDShrapt.Reader/Statements/IfStatement/GDIfBranch.cs @@ -3,7 +3,8 @@ public sealed class GDIfBranch : GDNode, ITokenOrSkipReceiver, ITokenOrSkipReceiver, - ITokenOrSkipReceiver + ITokenOrSkipReceiver, + ITokenOrSkipReceiver { public GDIfKeyword IfKeyword { @@ -188,5 +189,28 @@ void ITokenSkipReceiver.HandleReceivedTokenSkip() throw new GDInvalidStateException(); } + + void ITokenReceiver.HandleReceivedToken(GDStatementsList token) + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + Statements = token; + return; + } + + throw new GDInvalidStateException(); + } + + void ITokenSkipReceiver.HandleReceivedTokenSkip() + { + if (_form.IsOrLowerState(State.Statements)) + { + _form.State = State.Completed; + return; + } + + throw new GDInvalidStateException(); + } } }