diff --git a/StgSharp.Script/Common/CompileDepthState.cs b/StgSharp.Script/Common/CompileDepthState.cs new file mode 100644 index 00000000..fae71d5d --- /dev/null +++ b/StgSharp.Script/Common/CompileDepthState.cs @@ -0,0 +1,70 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="CompileDepthState.cs" +// Project: StgSharp +// AuthorGroup: Nitload Space +// Copyright (c) Nitload Space. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the “Software”), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and +// this permission notice shall be included in all copies +// or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED “AS IS”, +// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StgSharp.Script +{ + public interface ICompileDepthState { } + + public class CompileDepthMark + { + + public CompileDepthMark( int operatorBegin, int operandBegin, int usage ) + { + OperatorBegin = operatorBegin; + OperandBegin = operandBegin; + } + + public CompileDepthMark( + int operatorBegin, + int operandBegin, + int usage, + ICompileDepthState stateCache ) + { + OperatorBegin = operatorBegin; + OperandBegin = operandBegin; + Usage = usage; + } + + public ICompileDepthState StateCache { get; internal set; } + + public int OperandBegin { get; internal set; } + + public int OperatorBegin { get; internal set; } + + public int Usage { get; internal set; } + + } +} diff --git a/StgSharp.Script/Common/CompileStack.cs b/StgSharp.Script/Common/CompileStack.cs index 4a977012..7f1deb94 100644 --- a/StgSharp.Script/Common/CompileStack.cs +++ b/StgSharp.Script/Common/CompileStack.cs @@ -179,6 +179,11 @@ namespace StgSharp.Script _operatorCount++; } + public T StateOfCurrentDepth() where T: class, ICompileDepthState + { + return ( CurrentDepthMark.StateCache as T )!; + } + public bool TryPeekOperand( out bool isNode, out Token t, out TNode n ) { if( OperandAheadOfDepth <= 0 ) @@ -250,22 +255,4 @@ namespace StgSharp.Script } } - - public class CompileDepthMark - { - - public CompileDepthMark( int operatorBegin, int operandBegin, int state ) - { - OperatorBegin = operatorBegin; - OperandBegin = operandBegin; - State = state; - } - - public int OperandBegin { get; internal set; } - - public int OperatorBegin { get; internal set; } - - public int State { get; internal set; } - - } } diff --git a/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs b/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs index eca4698c..6ea752af 100644 --- a/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs +++ b/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs @@ -38,29 +38,5 @@ using ExpKeyword = StgSharp.Script.Express.ExpressCompile.Keyword; namespace StgSharp.Script.Express { - public partial class ExpNodeGenerator - { - - private bool TryParseBranch( Token t ) - { - if( t.Value == ExpKeyword.Case ) - { - _cache.PushOperator( t ); - _cache.IncreaseDepth( ( int )ExpCompileStateCode.CaseBranch ); - return true; - } else if( t.Value == ExpKeyword.If ) - { - _cache.PushOperator( t ); - _cache.IncreaseDepth( ( int )ExpCompileStateCode.IfBranch ); - return true; - } else if( t.Value == ExpKeyword.Repeat ) - { - _cache.PushOperator( t ); - _cache.IncreaseDepth( ( int )ExpCompileStateCode.RepeatLoop ); - return true; - } - return false; - } - - } + public partial class ExpNodeGenerator { } } diff --git a/StgSharp.Script/Express/ExpNodeGenerator.DepthEnter.cs b/StgSharp.Script/Express/ExpNodeGenerator.DepthEnter.cs new file mode 100644 index 00000000..32953fd0 --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.DepthEnter.cs @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeGenerator.DepthEnter.cs" +// Project: StgSharp +// AuthorGroup: Nitload Space +// Copyright (c) Nitload Space. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the “Software”), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and +// this permission notice shall be included in all copies +// or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED “AS IS”, +// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +using Microsoft.CodeAnalysis.Diagnostics; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ExpKeyword = StgSharp.Script.Express.ExpressCompile.Keyword; + +namespace StgSharp.Script.Express +{ + public partial class ExpNodeGenerator + { + + internal void AttemptEnterNewDepth( Token t ) + { + switch( t.Value ) + { + case ExpKeyword.If: + _cache.IncreaseDepth( ( int )ExpCompileStateCode.IfBranch ); + return; + case ExpKeyword.Case: + _cache.IncreaseDepth( ( int )ExpCompileStateCode.CaseBranch ); + return; + case ExpKeyword.Repeat: + _cache.IncreaseDepth( ( int )ExpCompileStateCode.RepeatLoop ); + return; + case ExpKeyword.While: + _cache.IncreaseDepth( ( int )ExpCompileStateCode.UntilLoop ); + return; + + default: + break; + } + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.If.cs b/StgSharp.Script/Express/ExpNodeGenerator.If.cs new file mode 100644 index 00000000..772ca84b --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.If.cs @@ -0,0 +1,104 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeGenerator.If.cs" +// Project: StgSharp +// AuthorGroup: Nitload Space +// Copyright (c) Nitload Space. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the “Software”), to deal in the Software without restriction, +// including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, +// and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and +// this permission notice shall be included in all copies +// or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED “AS IS”, +// WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH +// THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +// +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using ExpKeyword = StgSharp.Script.Express.ExpressCompile.Keyword; + +namespace StgSharp.Script.Express +{ + public partial class ExpNodeGenerator + { + + private bool TryParseIfExpression( Token t ) + { + switch( t.Value ) + { + case ExpKeyword.If: + IfBranchStateCache state = new IfBranchStateCache(); + _cache.CurrentDepthMark.StateCache = state; + state.CurrentState = t.Value; + return true; + case ExpKeyword.Then: + state = _cache.StateOfCurrentDepth(); + if( state.CurrentState == ExpKeyword.If ) { } else + { + throw new ExpCompileException( + t, $"Keyword {t.Value} should be after keyword {ExpKeyword.Then}" ); + } + return true; + case ExpKeyword.Else: + state = _cache.StateOfCurrentDepth(); + if( state.CurrentState == ExpKeyword.Then ) { } else + { + throw new ExpCompileException( + t, $"Keyword {t.Value} should be after keyword {ExpKeyword.Then}" ); + } + return true; + case ExpKeyword.EndIf: + state = _cache.StateOfCurrentDepth(); + if( state.CurrentState == ExpKeyword.Then ) + { + //no else occur + } else if( state.CurrentState == ExpKeyword.Else ) + { + // else occur + } else + { + throw new ExpCompileException( + t, + $"Keyword {t.Value} should be after keyword {ExpKeyword.Then} or {ExpKeyword.Else}" ); + } + return true; + default: + AppendToken_common( t ); + return true; + } + } + + private class IfBranchStateCache : ICompileDepthState + { + + public ExpNode BoolExpression { get; set; } + + public ExpNode ExpressionIfTrue { get; set; } + + public ExpNode ExpressionIfFalse { get; set; } + + public string CurrentState { get; set; } + + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.cs b/StgSharp.Script/Express/ExpNodeGenerator.cs index c955a09e..8bebe243 100644 --- a/StgSharp.Script/Express/ExpNodeGenerator.cs +++ b/StgSharp.Script/Express/ExpNodeGenerator.cs @@ -78,12 +78,23 @@ namespace StgSharp.Script.Express } /**/ + public void AppendToken( Token expToken ) + { + switch( ( ExpCompileStateCode )_cache.CurrentDepthMark.Usage ) + { + case ExpCompileStateCode.Common: + AppendToken_common( expToken ); + break; + default: + break; + } + } /// /// Append a token to top of cache. This method will automatically convert token to node /// if meets separators or operators. /// - public void AppendToken( Token expToken ) + public void AppendToken_common( Token expToken ) { switch( expToken.Flag ) { @@ -127,6 +138,27 @@ namespace StgSharp.Script.Express throw new NotImplementedException(); } + private bool TryParseBranch( Token t ) + { + if( t.Value == ExpKeyword.Case ) + { + _cache.PushOperator( t ); + _cache.IncreaseDepth( ( int )ExpCompileStateCode.CaseBranch ); + return true; + } else if( t.Value == ExpKeyword.If ) + { + _cache.PushOperator( t ); + _cache.IncreaseDepth( ( int )ExpCompileStateCode.IfBranch ); + return true; + } else if( t.Value == ExpKeyword.Repeat ) + { + _cache.PushOperator( t ); + _cache.IncreaseDepth( ( int )ExpCompileStateCode.RepeatLoop ); + return true; + } + return false; + } + /**/ public enum ExpCompileStateCode diff --git a/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.AssemblyInfo.cs b/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.AssemblyInfo.cs index 6a583a5c..4ad288f2 100644 --- a/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.AssemblyInfo.cs +++ b/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ffd5825a051f04f4105ac5ed02e754176ce6f608")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+469cb884729b9a2d0845a1e971d353c43ba6f5f9")] [assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]