Daily update on 20250307-071126 by Nitload Youmu. Additional Message : Rewrite of token and node cache stack
Signed-off-by: Nitload <YoumuLiu_NSI@whv0t.onmicrosoft.com>
This commit is contained in:
@@ -70,7 +70,7 @@ namespace StgSharp.Internal
|
|||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO 虚拟文件夹的GetBytes好难写
|
//TODO TOUGH TO Get Bytes from virtual folders
|
||||||
public byte[] GetBytes()
|
public byte[] GetBytes()
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
|
|||||||
@@ -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<TNode, TType>
|
||||||
|
where TNode: IASTNode<TNode, TType>
|
||||||
|
where TType: ITypeSource<TType>
|
||||||
|
{
|
||||||
|
|
||||||
|
private List<TNode> _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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<char> sourceSpan = line.AsSpan();
|
||||||
|
ReadOnlySpan<char> 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<char> sourceSpan = line.AsSpan();
|
||||||
|
ReadOnlySpan<char> 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 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<TNode, TType>
|
||||||
|
where TNode: IASTNode<TNode, TType>
|
||||||
|
where TType: ITypeSource<TType>
|
||||||
|
{
|
||||||
|
|
||||||
|
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<CompileDepthMark> _depthStack = new Stack<CompileDepthMark>(
|
||||||
|
);
|
||||||
|
|
||||||
|
private Stack<bool> _isNode = new Stack<bool>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<TNode, TType> where TNode: IASTNode<TNode, TType>
|
||||||
|
where TType: ITypeSource<TType>
|
||||||
|
{
|
||||||
|
|
||||||
|
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 );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 );
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return part of current provider.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="count"> Count of lines to be sliced </param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public IScriptSourceProvider Slice( int location, int count );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<in TConvert>
|
||||||
|
where TConvert: ITypeSource<TConvert>
|
||||||
|
{
|
||||||
|
|
||||||
|
bool IsConvertable( TConvert targetType );
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 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.
|
||||||
|
/// </summary>
|
||||||
|
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<string> _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<string>();
|
||||||
|
_completeMark = endMark;
|
||||||
|
_begin = start;
|
||||||
|
_index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScriptSourceTransmitter(
|
||||||
|
string endMark,
|
||||||
|
int start,
|
||||||
|
int capacity )
|
||||||
|
{
|
||||||
|
_cache = new List<string>( 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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<int> _callDepth = new Stack<int>();
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<ExpNode, IExpElementSource> _cache;
|
||||||
|
|
||||||
|
private ExpNode _lastStatement;
|
||||||
|
|
||||||
|
private GeneratedExpSchema _context;
|
||||||
|
private IExpElementSource _local;
|
||||||
|
|
||||||
|
public ExpNodeGenerator()
|
||||||
|
{
|
||||||
|
_cache = new CompileStack<ExpNode, IExpElementSource>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Append a token to top of cache. This method will automatically convert token to node if
|
||||||
|
/// meets separators or operators.
|
||||||
|
/// </summary>
|
||||||
|
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 { }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// WARNING: This method cannot process INDEXOF, FUNCTION CALLING, LOOP and any ENDING
|
||||||
|
/// SYMBOLS.
|
||||||
|
/// </summary>
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<ExpNode>
|
||||||
|
{
|
||||||
|
|
||||||
|
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<ExpNode>.Current => throw new NotImplementedException(
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Script")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Script")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[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.AssemblyProductAttribute("StgSharp.Script")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Script")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Script")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|||||||
Reference in New Issue
Block a user