diff --git a/StgSharp.Common/Data/SSD/SSDVirtualFolder.cs b/StgSharp.Common/Data/SSD/SSDVirtualFolder.cs index 68dbb1d6..1c18c666 100644 --- a/StgSharp.Common/Data/SSD/SSDVirtualFolder.cs +++ b/StgSharp.Common/Data/SSD/SSDVirtualFolder.cs @@ -70,7 +70,7 @@ namespace StgSharp.Internal throw new NotImplementedException(); } - //TODO 虚拟文件夹的GetBytes好难写 + //TODO TOUGH TO Get Bytes from virtual folders public byte[] GetBytes() { throw new NotImplementedException(); diff --git a/StgSharp.Script/Common/AbstractSyntaxTree.cs b/StgSharp.Script/Common/AbstractSyntaxTree.cs new file mode 100644 index 00000000..f0089730 --- /dev/null +++ b/StgSharp.Script/Common/AbstractSyntaxTree.cs @@ -0,0 +1,61 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="AbstractSyntaxTree.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 StgSharp.Collections; + +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Schema; + +namespace StgSharp.Script +{ + public sealed class AbstractSyntaxTree + where TNode: IASTNode + where TType: ITypeSource + { + + private List _allToken = new(); + private TNode _root; + + public int Count + { + get { return _allToken.Count; } + } + + public TNode Root => _root; + + public bool Contains( TNode node ) + { + return _allToken.Contains( node ); + } + + } +} diff --git a/StgSharp.Script/Common/CodeLineHelper.cs b/StgSharp.Script/Common/CodeLineHelper.cs new file mode 100644 index 00000000..49309174 --- /dev/null +++ b/StgSharp.Script/Common/CodeLineHelper.cs @@ -0,0 +1,108 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="CodeLineHelper.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.Text; + +namespace StgSharp.Script +{ + public static class CodeLineHelper + { + + public static string SliceAndTrim( this string line, int startIndex ) + { + if( line == null ) { + throw new ArgumentNullException( nameof( line ) ); + } + + if( startIndex < 0 || startIndex >= line.Length ) { + throw new ArgumentOutOfRangeException( nameof( startIndex ) ); + } + + ReadOnlySpan sourceSpan = line.AsSpan(); + ReadOnlySpan subSpan = sourceSpan.Slice( startIndex ); + + int start = 0; + while( start < subSpan.Length && char.IsWhiteSpace( + subSpan[ start ] ) ) { + start++; + } + int end = subSpan.Length - 1; + while( end >= start && char.IsWhiteSpace( subSpan[ end ] ) ) { + end--; + } + if( start > end ) { + return string.Empty; + } + int finalLength = end - start + 1; + + return new string( subSpan.Slice( start, finalLength ) ); + } + + public static string SliceAndTrim( + this string line, + int startIndex, + int length ) + { + if( line == null ) { + throw new ArgumentNullException( nameof( line ) ); + } + + if( startIndex < 0 || startIndex >= line.Length ) { + throw new ArgumentOutOfRangeException( nameof( startIndex ) ); + } + + if( length < 0 || startIndex + length > line.Length ) { + throw new ArgumentOutOfRangeException( nameof( length ) ); + } + + ReadOnlySpan sourceSpan = line.AsSpan(); + ReadOnlySpan subSpan = sourceSpan.Slice( startIndex, length ); + + int start = 0; + while( start < subSpan.Length && char.IsWhiteSpace( + subSpan[ start ] ) ) { + start++; + } + int end = subSpan.Length - 1; + while( end >= start && char.IsWhiteSpace( subSpan[ end ] ) ) { + end--; + } + if( start > end ) { + return string.Empty; + } + int finalLength = end - start + 1; + + return new string( subSpan.Slice( start, finalLength ) ); + } + + } +} diff --git a/StgSharp.Script/Common/CompileStack.cs b/StgSharp.Script/Common/CompileStack.cs new file mode 100644 index 00000000..a45cf760 --- /dev/null +++ b/StgSharp.Script/Common/CompileStack.cs @@ -0,0 +1,171 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="CompileStack.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.Data; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace StgSharp.Script +{ + public partial class CompileStack + where TNode: IASTNode + where TType: ITypeSource + { + + private TNode[] _nodeArray = new TNode[4]; + private Token[] _operatorArray = new Token[4]; + private Token[] _tokenArray = new Token[4]; + + private int _nodeCount,_tokenCount, _operatorCount; + private Stack _depthStack = new Stack( + ); + + private Stack _isNode = new Stack(); + + public int Depth => _depthStack.Count; + + public int OperandCount => _isNode.Count; + + public int OperatorCount => _operatorCount; + + public int OperatorAheadOfDepth + { + get => OperatorCount - _depthStack.Peek().OperatorBegin; + } + + public int OperandAheadOfDepth + { + get => OperandCount - _depthStack.Peek().OperandBegin; + } + + public void DecreaseDepth() + { + CompileDepthMark mark = _depthStack.Pop(); + } + + public void IncreaseDepth() + { + _depthStack.Push( + new CompileDepthMark + { + OperandBegin = OperandCount, + OperatorBegin = OperatorCount + } ); + } + + public bool PeekOperand( out Token t, out TNode n ) + { + if( OperandAheadOfDepth <= 0 ) { + t = Token.Empty; + n = TNode.Empty; + return false; + } + if( _isNode.Pop() ) { + t = Token.Empty; + n = _nodeArray[ _nodeCount - 1 ]; + return true; + } else { + t = _tokenArray[ _tokenCount - 1 ]; + n = TNode.Empty; + return false; + } + } + + public Token PeekOperator() + { + if( OperatorAheadOfDepth > 0 ) { + return _operatorArray[ _operatorCount - 1 ]; + } + return Token.Empty; + } + + public bool PopOperand( out Token t, out TNode n ) + { + if( _isNode.Pop() ) { + t = Token.Empty; + n = _nodeArray[ --_nodeCount ]; + return true; + } else { + t = _tokenArray[ --_tokenCount ]; + n = TNode.Empty; + return false; + } + } + + public Token PopOperator() + { + _operatorCount--; + return _operatorArray[ _operatorCount ]; + } + + public void PushOperand( TNode node ) + { + if( _nodeArray.Length == _nodeCount ) { + Array.Resize( ref _nodeArray, _nodeArray.Length * 2 ); + } + _nodeArray[ _nodeCount ] = node; + _nodeCount++; + _isNode.Push( true ); + } + + public void PushOperand( Token token ) + { + if( _tokenArray.Length == _tokenCount ) { + Array.Resize( ref _tokenArray, _tokenArray.Length * 2 ); + } + _tokenArray[ _tokenCount ] = token; + _tokenCount++; + _isNode.Push( false ); + } + + public void PushOperator( Token token ) + { + if( _operatorArray.Length == _operatorCount ) { + Array.Resize( ref _operatorArray, _operatorArray.Length * 2 ); + } + _operatorArray[ _operatorCount ] = token; + _operatorCount++; + _isNode.Push( false ); + } + + } + + public struct CompileDepthMark + { + + public int OperandBegin; + public int OperatorBegin; + + } +} diff --git a/StgSharp.Script/Common/IASTNode.cs b/StgSharp.Script/Common/IASTNode.cs new file mode 100644 index 00000000..dcab775a --- /dev/null +++ b/StgSharp.Script/Common/IASTNode.cs @@ -0,0 +1,98 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="IASTNode.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 StgSharp.Collections; +using StgSharp.Script.Express; + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace StgSharp.Script +{ + public interface IASTNode where TNode: IASTNode + where TType: ITypeSource + { + + long NodeFlag + { + get; + } + + string Name + { + get; + } + + string CodeConvertTemplate + { + get; + } + + TNode Previous + { + get; + set; + } + + TNode Next + { + get; + set; + } + + TNode Left + { + get; + } + + TNode Right + { + get; + } + + static abstract TNode Empty + { + get; + } + + TType EqualityTypeConvert + { + get; + } + + void AppendNode( TNode nextToken ); + + void PrependNode( TNode previusNode ); + + } +} diff --git a/StgSharp.Script/Common/IScriptSourceProvider.cs b/StgSharp.Script/Common/IScriptSourceProvider.cs new file mode 100644 index 00000000..dfe2bcd4 --- /dev/null +++ b/StgSharp.Script/Common/IScriptSourceProvider.cs @@ -0,0 +1,64 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="IScriptSourceProvider.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.Text; + +namespace StgSharp.Script +{ + public interface IScriptSourceProvider + { + + bool IsEmpty + { + get; + } + + int Location + { + get; + } + + void EndWriting(); + + string ReadLine(); + + string ReadLine( out int position ); + + /// + /// Return part of current provider. + /// + /// Count of lines to be sliced + /// + public IScriptSourceProvider Slice( int location, int count ); + + } +} diff --git a/StgSharp.Script/Common/ITypeSource.cs b/StgSharp.Script/Common/ITypeSource.cs new file mode 100644 index 00000000..ea1daaba --- /dev/null +++ b/StgSharp.Script/Common/ITypeSource.cs @@ -0,0 +1,46 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ITypeSource.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 ITypeSource + where TConvert: ITypeSource + { + + bool IsConvertable( TConvert targetType ); + + } +} diff --git a/StgSharp.Script/Common/ScriptSourceTransmitter.cs b/StgSharp.Script/Common/ScriptSourceTransmitter.cs new file mode 100644 index 00000000..efa9287c --- /dev/null +++ b/StgSharp.Script/Common/ScriptSourceTransmitter.cs @@ -0,0 +1,159 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ScriptSourceTransmitter.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; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace StgSharp.Script +{ + /// + /// Transmit a continuous part of script code to interpreter or compiler. This transmitter is + /// designed for single-thread-write and single-thread read. Any multi thread operation will + /// cause undefined behaviour. + /// + public class ScriptSourceTransmitter : IScriptSourceProvider + { + + private static ScriptSourceTransmitter _empty = new ScriptSourceTransmitter( + string.Empty, 0, 0 ) + { + _cache = [], + _buffer = [] + }; + + private string[] _buffer; + private bool _isWriting = true; + private int _begin, _index; + private List _cache; + private readonly string _completeMark; + + internal ScriptSourceTransmitter( string[] buffer, int start ) + { + _buffer = buffer; + _begin = start; + _isWriting = false; + } + + public ScriptSourceTransmitter( string endMark, int start ) + { + _cache = new List(); + _completeMark = endMark; + _begin = start; + _index = 0; + } + + public ScriptSourceTransmitter( + string endMark, + int start, + int capacity ) + { + _cache = new List( capacity ); + _completeMark = endMark; + _begin = start; + _index = 0; + } + + public bool IsEmpty => _isWriting ? + ( _cache.Count == 0 ) : ( _buffer.Length == 0 ) || ( _index >= + _buffer.Length ); + + public bool IsFrozen => !_isWriting; + + public int Location => _begin + _index; + + public static ScriptSourceTransmitter Empty => _empty; + + public void EndWriting() + { + if( !_isWriting ) { + return; + } + _isWriting = false; + _buffer = _cache.ToArray(); + _cache = null!; + } + + public string ReadLine() + { + if( _isWriting ) { + throw new InvalidOperationException( + "Cannot read before all writing operation." ); + } + if( _index >= _buffer.Length ) { + return string.Empty; + } + string str = _buffer[ _index ]; + _index++; + return str; + } + + public string ReadLine( out int position ) + { + if( _isWriting ) { + throw new InvalidOperationException( + "Cannot read before all writing operation." ); + } + if( _index >= _buffer.Length ) { + position = -1; + return string.Empty; + } + position = _begin + _index; + string str = _buffer[ _index ]; + _index++; + return str; + } + + public IScriptSourceProvider Slice( int location, int count ) + { + ArgumentOutOfRangeException.ThrowIfLessThan( location, _begin ); + ArgumentOutOfRangeException.ThrowIfGreaterThan( + location + count, _begin + _buffer.Length ); + return new ScriptSourceTransmitter( + _buffer.AsSpan().Slice( location, count ).ToArray(), location ); + } + + public void WriteLine( string line ) + { + if( !_isWriting ) { + return; + } + if( string.Equals( _completeMark, line ) ) { + EndWriting(); + return; + } + _cache.Add( line ); + } + + } +} diff --git a/StgSharp.Script/Common/Token.cs b/StgSharp.Script/Common/Token.cs new file mode 100644 index 00000000..2130c705 --- /dev/null +++ b/StgSharp.Script/Common/Token.cs @@ -0,0 +1,80 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="Token.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 readonly struct Token + { + + private static Token EmptyToken = new Token(); + + public readonly int Column; + public readonly int Line; + public readonly string Value; + public readonly TokenFlag Flag; + + public Token( + string chars, + int lineNumber, + int columnNumber, + TokenFlag flag ) + { + Value = chars; + Line = lineNumber; + Column = columnNumber; + Flag = flag; + } + + public static Token Empty => EmptyToken; + + } + + public enum TokenFlag : int + { + + Symbol_Unary = 1, + Symbol_Binary = 2, + Number = 3, + String = 4, + Member = 5, + Separator_Single = 6, + Separator_Left = 7, + Separator_Right = 8, + Index_Left = 9, + Index_Right = 10, + + } +} diff --git a/StgSharp.Script/Express/ExpAstNode/ExpElementMemberNameNode.cs b/StgSharp.Script/Express/ExpAstNode/ExpElementMemberNameNode.cs new file mode 100644 index 00000000..79914f8e --- /dev/null +++ b/StgSharp.Script/Express/ExpAstNode/ExpElementMemberNameNode.cs @@ -0,0 +1,62 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpElementMemberNameNode.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.Express.ExpAstNode +{ + public class ExpElementMemberNameNode : ExpNode + { + + public ExpElementMemberNameNode( string memberName ) + : base( memberName ) { } + + public override ExpNode Left => Empty; + + public override ExpNode Right => Empty; + + public override IExpElementSource EqualityTypeConvert + { + get + { + ExpSchema.BuiltinSchema + .TryGetType( + ExpCompile.KeyWord.String, + out ExpTypeSource? strType ); + return strType; + } + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeFlag.cs b/StgSharp.Script/Express/ExpNodeFlag.cs new file mode 100644 index 00000000..b9d15b3b --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeFlag.cs @@ -0,0 +1,97 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeFlag.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.Express +{ + [Flags] + public enum ExpNodeFlag : long + { + + //string as name of non-builtin variables + None = 0, + Name_Element = 1, + Name_Param = 2, + Name_Block = 4, + Name_Keyword = 8, + Name_Operator = 16, + Name_Any = Name_Block | Name_Element | Name_Keyword | Name_Param | Name_Operator, + + //any type of collections, also has NAME flag + Collection_Set = 32, + Collection_Bag = 64, + Collection_Array = 128, + Collection_List = 256, + Collection_Any = Collection_Set | Collection_Bag | Collection_Array | Collection_List, + + //the variable is type of element, both builtin and non-builtin has this flag + Element_Const = 512, + Element_Entity = 1024, + Element_Type = 2048, + Element_Rule = 4096, + Element_Function = 8192, + Element_Any = Element_Entity | Element_Const | Element_Function | Element_Rule | Element_Type, + + //variable is one of these builtin type + BuiltinType_Int = 16384, + BuiltinType_Float = 32768, + BuiltinType_String = 65536, + BuiltinType_Boolean = 0x2000, + BuiltinType_Binary = 0x4000, + BuiltinType_Logic = 0x8000, + BuiltinType_Number = BuiltinType_Float | BuiltinType_Int, + BuiltinType_Any = BuiltinType_Int | BuiltinType_Float | BuiltinType_String | BuiltinType_Boolean | BuiltinType_Binary | BuiltinType_Logic, + + //the token is root of a branch + Branch_If = 0x1_000, + Branch_Switch = 0x2_0000, + Branch_Repeat = 0x4_0000, + Branch_Any = Branch_If | Branch_Repeat | Branch_Switch, + + //the token is one of separators + Separator_Inline = 0x8_0000, //, or sth else + Separator_Line = 0x10_0000, //; or eth else + Separator_Block = 0x20_0000, //{}or sth else + Separator_Range = 0x40_0000, //()or sth else + Separator_Any = Separator_Inline | Separator_Line | Separator_Block | Separator_Range, + + //the token is a kind of operator + Operator_Unary = 0x40_0000, + Operator_Binary = 0x80_0000, + Operator_SuperType = 0x100_0000, + Operator_Any = Operator_Unary | Operator_Binary | Operator_SuperType, + + } +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.ErrorProcess.cs b/StgSharp.Script/Express/ExpNodeGenerator.ErrorProcess.cs new file mode 100644 index 00000000..39182ea8 --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.ErrorProcess.cs @@ -0,0 +1,55 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpErrorThrow.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.Express +{ + public partial class ExpNodeGenerator + { + + public void ThrowCompileException( int errorCode ) + { + switch( errorCode ) { + case 0 or 1: + return; + case TokenTypeNotMatch: + throw new Exception(); + default: + break; + } + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.FunctionCalling.cs b/StgSharp.Script/Express/ExpNodeGenerator.FunctionCalling.cs new file mode 100644 index 00000000..ca78f800 --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.FunctionCalling.cs @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeGenerator.FunctionCalling.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 static StgSharp.Script.Express.ExpCompile; + +namespace StgSharp.Script.Express +{ + public partial class ExpNodeGenerator + { + + private bool _isCallingFunction = false; + private Stack _callDepth = new Stack(); + + private void EnterFunctionCalling( Token funcNameToken ) + { + _isCallingFunction = true; + _callDepth.Push( _operandsToken.Count ); + } + + private void ExitFunctionCalling() + { + _callDepth.Pop(); + if( _callDepth.Count == 0 ) { + _isCallingFunction = false; + } + } + + //TODO cannot process occasion of void input or null at first + //put one of param to tail of function calling pram expression node + private void MergeFunctionCallingParameter() + { + if( _cache.OperandAheadOfDepth == 1 ) { + if( _cache.PopOperand( out Token t, out ExpNode? n ) ) { + n!.PrependNode( + ExpNode.NonOperation( PoolString( "FuncParam" ) ) ); + } else { } + } else { + //TODO compile the param expression + } + } + + } +} +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.Operator.cs b/StgSharp.Script/Express/ExpNodeGenerator.Operator.cs new file mode 100644 index 00000000..a55def78 --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.Operator.cs @@ -0,0 +1,94 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="GenerateOperatorToken.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.Express +{ + public partial class ExpNodeGenerator + { + + public int CompareOperatorPrecedence( Token left, Token right ) + { + ExpCompile.TryGetOperatorPrecedence( + left.Value, out int leftPrecedence ); + ExpCompile.TryGetOperatorPrecedence( + right.Value, out int rightPrecedence ); + return leftPrecedence - rightPrecedence; + } + + public bool TryGenerateBinaryNode( Token t, out ExpNode node ) + { + ExpNode left = GetNextOperandCache(); + ExpNode right = GetNextOperandCache(); + switch( t.Value ) { + case ExpCompile.KeyWord.ADD: + node = ExpBinaryOperatorNode.Add( left, right ); + return true; + case ExpCompile.KeyWord.SUB: + node = ExpBinaryOperatorNode.Sub( left, right ); + return true; + case ExpCompile.KeyWord.MUL: + node = ExpBinaryOperatorNode.Mul( left, right ); + return true; + case ExpCompile.KeyWord.DIV: + node = ExpBinaryOperatorNode.Div( left, right ); + return true; + default: + node = ExpNode.Empty; + return false; + } + } + + public bool TryGenerateUnaryNode( Token t, out ExpNode node ) + { + ExpNode operand = GetNextOperandCache(); + switch( t.Value ) { + case ExpCompile.KeyWord.UnaryPlus: + node = ExpUnaryOperatorNode.UnaryPlus( operand ); + return true; + case ExpCompile.KeyWord.UnaryMinus: + node = ExpUnaryOperatorNode.UnaryMinus( operand ); + return true; + case ExpCompile.KeyWord.NOT: + node = ExpUnaryOperatorNode.UnaryNot( operand ); + return true; + default: + node = ExpNode.Empty; + return false; + } + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.StateManage.cs b/StgSharp.Script/Express/ExpNodeGenerator.StateManage.cs new file mode 100644 index 00000000..99c5a568 --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.StateManage.cs @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeGenerator.StateManage.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.Frozen; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace StgSharp.Script.Express +{ + public partial class ExpNodeGenerator + { + + private CompileState _state = CompileState.Common; + private int _lbToken = 0; // [ count + private int _lcbCount = 0; // { count + private int _lpCount = 0; // ( count + + private void ProcessLeftSeparator( Token t ) + { + switch( t.Value ) { + case "[": + _lbToken++; + break; + case "{": + _lcbCount++; + break; + case "(": + _lpCount++; + break; + default: + break; + } + } + + private enum CompileState + { + + Common, + FunctionCalling, + Branch, + Loop, + + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeGenerator.cs b/StgSharp.Script/Express/ExpNodeGenerator.cs new file mode 100644 index 00000000..868c2e7e --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeGenerator.cs @@ -0,0 +1,128 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeGenerator.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 StgSharp.Threading; + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StgSharp.Script.Express +{ + public partial class ExpNodeGenerator + { + + private const int EndLine = 1; + private const int TokenGenerated = 0; + private const int TokenTypeNotMatch = -1; + + private CompileStack _cache; + + private ExpNode _lastStatement; + + private GeneratedExpSchema _context; + private IExpElementSource _local; + + public ExpNodeGenerator() + { + _cache = new CompileStack(); + } + + /// + /// 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 ) + { + switch( expToken.Flag ) { + case TokenFlag.Symbol_Unary or TokenFlag.Symbol_Binary: + int cmp = -1; + processPrecedence: + Token tmp = _cache.PeekOperator(); + cmp = CompareOperatorPrecedence( expToken, tmp ); + if( cmp <= 0 ) { + ConvertOneOperator(); + goto processPrecedence; + } + _cache.PushOperand( expToken ); + break; + case TokenFlag.Number or TokenFlag.String or TokenFlag.Member: + _cache.PushOperand( expToken ); + break; + case TokenFlag.Separator_Single: //a , ; found + //if operator stack is not empty, convert all operators to node until meet a separator + break; + case TokenFlag.Separator_Left: //a ( [ { found + _cache.PushOperator( expToken ); + break; + case TokenFlag.Separator_Right: //a } ] ) found + break; + case TokenFlag.Index_Left: // a [ found + break; + case TokenFlag.Index_Right: // a ] found + break; + default: + break; + } + } + + public ExpNode GetNextOperandCache() + { + if( _cache.PopOperand( out Token t, out ExpNode? n ) ) { + return n; + } else { } + } + + /// + /// WARNING: This method cannot process INDEXOF, FUNCTION CALLING, LOOP and any ENDING + /// SYMBOLS. + /// + private void ConvertOneOperator() + { + Token @operator = _cache.PopOperator(); + switch( @operator.Flag ) { + case TokenFlag.Symbol_Unary: + TryGenerateUnaryNode( @operator, out ExpNode? node ); + _cache.PushOperand( node ); + break; + case TokenFlag.Symbol_Binary: + TryGenerateBinaryNode( @operator, out node ); + _cache.PushOperand( node ); + break; + default: + break; + } + } + + } +} diff --git a/StgSharp.Script/Express/ExpNodeNextEnumerator.cs b/StgSharp.Script/Express/ExpNodeNextEnumerator.cs new file mode 100644 index 00000000..59af23cb --- /dev/null +++ b/StgSharp.Script/Express/ExpNodeNextEnumerator.cs @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpNodeNextEnumerator.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; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StgSharp.Script.Express +{ + public class ExpNodeNextEnumerator : IEnumerator + { + + private ExpNode _begin; + private ExpNode _current; + + public ExpNodeNextEnumerator( ExpNode token ) + { + _begin = token; + _current = token; + } + + void IDisposable.Dispose() + { + return; + } + + bool IEnumerator.MoveNext() + { + ExpNode next = _current.Next; + if( ReferenceEquals( next, _begin ) || next == null ) { + return false; + } + _current = next; + return true; + } + + void IEnumerator.Reset() + { + _current = _begin; + } + + object IEnumerator.Current => throw new NotImplementedException(); + + ExpNode IEnumerator.Current => throw new NotImplementedException( + ); + + } +} 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 1d9b5571..5c623611 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+c5777f4bfe31231c2026f5e0ffd291d5db793843")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8460bfd56ad622a66ba2c972a2de7e7f4d5f80d3")] [assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]