diff --git a/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.AssemblyInfo.cs b/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.AssemblyInfo.cs
index 2a46200b..d2fcafa6 100644
--- a/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.AssemblyInfo.cs
+++ b/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.AssemblyInfo.cs
@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.Model")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e3741687a706609a1d0055c3fd11f41945838a70")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6788bc4a0065508d7afa5f740da1b4ca6dd1efef")]
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Model")]
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Model")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.sourcelink.json b/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.sourcelink.json
index 03e04358..2eeaae6f 100644
--- a/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.sourcelink.json
+++ b/StgSharp.Model/obj/x64/Debug/net8.0/StgSharp.Model.sourcelink.json
@@ -1 +1 @@
-{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/e3741687a706609a1d0055c3fd11f41945838a70/*"}}
\ No newline at end of file
+{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/6788bc4a0065508d7afa5f740da1b4ca6dd1efef/*"}}
\ No newline at end of file
diff --git a/StgSharp.Script/Common/CompileStack.cs b/StgSharp.Script/Common/CompileStack.cs
index 77d3ea9b..1338bd79 100644
--- a/StgSharp.Script/Common/CompileStack.cs
+++ b/StgSharp.Script/Common/CompileStack.cs
@@ -172,7 +172,6 @@ namespace StgSharp.Script
}
_operatorArray[ _operatorCount ] = token;
_operatorCount++;
- _isNode.Push( false );
}
public bool TryPeekOperand( out bool isNode, out Token t, out TNode n )
@@ -223,7 +222,7 @@ namespace StgSharp.Script
t = _tokenArray[ --_tokenCount ];
n = TNode.Empty;
isNode = false;
- return false;
+ return true;
}
}
diff --git a/StgSharp.Script/Common/Token.cs b/StgSharp.Script/Common/Token.cs
index 06b1b7e2..ca7e5176 100644
--- a/StgSharp.Script/Common/Token.cs
+++ b/StgSharp.Script/Common/Token.cs
@@ -78,7 +78,7 @@ namespace StgSharp.Script
Number = 3,
String = 4,
Member = 5,
- Separator_Single = 6,
+ Separator_Middle = 6,
Separator_Left = 7,
Separator_Right = 8,
Index_Left = 9,
diff --git a/StgSharp.Script/Express/Element/ExpType.cs b/StgSharp.Script/Express/Element/ExpType.cs
index 7db4f475..6f567c22 100644
--- a/StgSharp.Script/Express/Element/ExpType.cs
+++ b/StgSharp.Script/Express/Element/ExpType.cs
@@ -77,7 +77,7 @@ namespace StgSharp.Script.Express
throw new NotImplementedException();
}
- public override ExpElementInstanceNode CreateInstanceNode()
+ public override ExpElementInstanceBase CreateInstanceNode()
{
throw new NotImplementedException();
}
diff --git a/StgSharp.Script/Express/ExpAstNode/ExpFunctionCallingNode.cs b/StgSharp.Script/Express/ExpAstNode/ExpFunctionCallingNode.cs
index 8672b831..16f44df2 100644
--- a/StgSharp.Script/Express/ExpAstNode/ExpFunctionCallingNode.cs
+++ b/StgSharp.Script/Express/ExpAstNode/ExpFunctionCallingNode.cs
@@ -43,10 +43,10 @@ namespace StgSharp.Script.Express
private ExpNode _parameter;
- public ExpFunctionCallingNode(
- Token source,
- ExpFunctionSource function,
- ExpNode firstParameter )
+ private ExpFunctionCallingNode(
+ Token source,
+ ExpFunctionSource function,
+ ExpNode firstParameter )
: base( source )
{
_function = function;
@@ -65,5 +65,13 @@ namespace StgSharp.Script.Express
_parameter.AppendNode( parameter );
}
+ public static ExpFunctionCallingNode CallFunction(
+ Token source,
+ ExpFunctionSource function,
+ ExpNode param )
+ {
+ return new ExpFunctionCallingNode( source, function, param );
+ }
+
}
}
diff --git a/StgSharp.Script/Express/ExpAstNode/ExpInstanceReferenceNode.cs b/StgSharp.Script/Express/ExpAstNode/ExpInstanceReferenceNode.cs
index e666874d..0ebaf8d1 100644
--- a/StgSharp.Script/Express/ExpAstNode/ExpInstanceReferenceNode.cs
+++ b/StgSharp.Script/Express/ExpAstNode/ExpInstanceReferenceNode.cs
@@ -40,17 +40,26 @@ namespace StgSharp.Script.Express
public class ExpInstanceReferenceNode : ExpNode
{
- private ExpElementInstanceNode _instance;
+ private ExpElementInstanceBase _instance;
internal ExpInstanceReferenceNode(
Token source,
- ExpElementInstanceNode instance )
+ ExpElementInstanceBase instance )
: base( source )
{
_instance = instance;
_nodeFlag = ( _instance._nodeFlag | ( ExpNodeFlag.Name_Any | ExpNodeFlag.Collection_Any ) );
}
+ internal ExpInstanceReferenceNode(
+ Token source,
+ ExpInstanceReferenceNode reference )
+ : base( source )
+ {
+ _instance = reference._instance;
+ _nodeFlag = ( _instance._nodeFlag | ( ExpNodeFlag.Name_Any | ExpNodeFlag.Collection_Any ) );
+ }
+
public override ExpNode Left => Empty;
public override ExpNode Right => Empty;
@@ -60,7 +69,7 @@ namespace StgSharp.Script.Express
[MethodImpl( MethodImplOptions.AggressiveInlining )]
public static ExpInstanceReferenceNode Create(
Token source,
- ExpElementInstanceNode instance )
+ ExpElementInstanceBase instance )
{
return new ExpInstanceReferenceNode( source, instance );
}
diff --git a/StgSharp.Script/Express/ExpExceptions.cs b/StgSharp.Script/Express/ExpExceptions.cs
index bff356a7..2dcdc445 100644
--- a/StgSharp.Script/Express/ExpExceptions.cs
+++ b/StgSharp.Script/Express/ExpExceptions.cs
@@ -34,6 +34,7 @@ using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
+using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace StgSharp.Script.Express
@@ -57,6 +58,25 @@ namespace StgSharp.Script.Express
}
+ public class ExpInvalidSyntaxException : Exception
+ {
+
+ public ExpInvalidSyntaxException( string message ) : base( message ) { }
+
+ public static void ThrowNonCollectionIndex( Token t )
+ {
+ throw new ExpInvalidSyntaxException(
+ $"Use a collection indexer to a non-collection variable at line {t.Line} column {t.Column}" );
+ }
+
+ public static void ThrowNoOperator( Token t )
+ {
+ throw new ExpInvalidSyntaxException(
+ $"No operator but more than one operand before line {t.Line} column {t.Column}" );
+ }
+
+ }
+
public class ExpInvalidElementDeclareEndingExceptions : Exception
{
@@ -136,4 +156,13 @@ namespace StgSharp.Script.Express
"Attempt to compile an EXPRESS script before the init of compiler." ) { }
}
+
+ public class ExpCompileException : Exception
+ {
+
+ public ExpCompileException( Token pos, string message )
+ : base(
+ $"Compiler exception occour when processing token at line {pos.Line}, column {pos.Column}. Detailed message:{Environment.NewLine}{message} " ) { }
+
+ }
}
diff --git a/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs b/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs
index 9f96d3d4..696af5ec 100644
--- a/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs
+++ b/StgSharp.Script/Express/ExpNodeGenerator.BranchParser.cs
@@ -34,7 +34,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using ExpKeyWord = StgSharp.Script.Express.ExpCompile.KeyWord;
+using ExpKeyword = StgSharp.Script.Express.ExpCompile.KeyWord;
namespace StgSharp.Script.Express
{
@@ -43,15 +43,15 @@ namespace StgSharp.Script.Express
private bool TryParseBranch( Token t )
{
- if( t.Value == ExpKeyWord.Case ) {
+ if( t.Value == ExpKeyword.Case ) {
_cache.PushOperator( t );
_cache.IncreaseDepth( ( int )ExpCompileStateCode.CaseBranch );
return true;
- } else if( t.Value == ExpKeyWord.If ) {
+ } else if( t.Value == ExpKeyword.If ) {
_cache.PushOperator( t );
_cache.IncreaseDepth( ( int )ExpCompileStateCode.IfBranch );
return true;
- } else if( t.Value == ExpKeyWord.Repeat ) {
+ } else if( t.Value == ExpKeyword.Repeat ) {
_cache.PushOperator( t );
_cache.IncreaseDepth( ( int )ExpCompileStateCode.RepeatLoop );
return true;
diff --git a/StgSharp.Script/Express/ExpNodeGenerator.OperatorParser.cs b/StgSharp.Script/Express/ExpNodeGenerator.OperatorParser.cs
index 15b72093..f2111c3b 100644
--- a/StgSharp.Script/Express/ExpNodeGenerator.OperatorParser.cs
+++ b/StgSharp.Script/Express/ExpNodeGenerator.OperatorParser.cs
@@ -34,7 +34,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using ExpKeyWord = StgSharp.Script.Express.ExpCompile.KeyWord;
+using ExpKeyword = StgSharp.Script.Express.ExpCompile.KeyWord;
namespace StgSharp.Script.Express
{
@@ -55,28 +55,28 @@ namespace StgSharp.Script.Express
ExpNode left = GetNextOperandCache();
ExpNode right = GetNextOperandCache();
switch( t.Value ) {
- case ExpKeyWord.Add:
+ case ExpKeyword.Add:
node = ExpBinaryOperatorNode.Add( t, left, right );
return true;
- case ExpKeyWord.Sub:
+ case ExpKeyword.Sub:
node = ExpBinaryOperatorNode.Sub( t, left, right );
return true;
- case ExpKeyWord.Mul:
+ case ExpKeyword.Mul:
node = ExpBinaryOperatorNode.Mul( t, left, right );
return true;
- case ExpKeyWord.Div:
+ case ExpKeyword.Div:
node = ExpBinaryOperatorNode.Div( t, left, right );
return true;
- case ExpKeyWord.Equal:
+ case ExpKeyword.Equal:
node = ExpBinaryOperatorNode.EqualTo( t, left, right );
return true;
- case ExpKeyWord.NotEqual:
+ case ExpKeyword.NotEqual:
node = ExpBinaryOperatorNode.NotEqualTo( t, left, right );
return true;
- case ExpKeyWord.GreaterThan:
+ case ExpKeyword.GreaterThan:
node = ExpBinaryOperatorNode.GreaterThan( t, left, right );
return true;
- case ExpKeyWord.LessThan:
+ case ExpKeyword.LessThan:
node = ExpBinaryOperatorNode.LessThan( t, left, right );
return true;
default:
@@ -89,13 +89,13 @@ namespace StgSharp.Script.Express
{
ExpNode operand = GetNextOperandCache();
switch( t.Value ) {
- case ExpKeyWord.UnaryPlus:
+ case ExpKeyword.UnaryPlus:
node = ExpUnaryOperatorNode.UnaryPlus( t, operand );
return true;
- case ExpKeyWord.UnaryMinus:
+ case ExpKeyword.UnaryMinus:
node = ExpUnaryOperatorNode.UnaryMinus( t, operand );
return true;
- case ExpKeyWord.Not:
+ case ExpKeyword.Not:
node = ExpUnaryOperatorNode.UnaryNot( t, operand );
return true;
default:
@@ -104,5 +104,52 @@ namespace StgSharp.Script.Express
}
}
+ ///
+ /// 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;
+ case TokenFlag.Member:
+ if( _context.TryGetFunction(
+ @operator.Value, out ExpFunctionSource? f ) ) {
+ if( !_cache.PopOperand( out Token t,
+ out ExpNode? p ) ) {
+ ExpFunctionCallingNode.CallFunction(
+ @operator, f, p );
+ } else {
+ throw new ExpCompileException(
+ t,
+ "An ExpNode for function calling is needed, but a token was popped" );
+ }
+ } else if( ExpSchema.BuiltinSchema
+ .TryGetFunction( @operator.Value, out f ) ) {
+ if( !_cache.PopOperand( out Token t,
+ out ExpNode? p ) ) {
+ ExpFunctionCallingNode.CallFunction(
+ @operator, f, p );
+ } else {
+ throw new ExpCompileException(
+ t,
+ "An ExpNode for function calling is needed, but a token was popped" );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
}
}
diff --git a/StgSharp.Script/Express/ExpNodeGenerator.TokenSpliter.cs b/StgSharp.Script/Express/ExpNodeGenerator.TokenSpliter.cs
index f538e799..d7bf3b00 100644
--- a/StgSharp.Script/Express/ExpNodeGenerator.TokenSpliter.cs
+++ b/StgSharp.Script/Express/ExpNodeGenerator.TokenSpliter.cs
@@ -34,92 +34,54 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using ExpKeyWord = StgSharp.Script.Express.ExpCompile.KeyWord;
+using ExpKeyword = StgSharp.Script.Express.ExpCompile.KeyWord;
namespace StgSharp.Script.Express
{
public partial class ExpNodeGenerator
{
- private void AppendToken_Common( Token t )
- {
- switch( t.Flag ) {
- // instance ref, make ref and push
- // function call, push as operator
- // keyword, call TryParseConstant method to process
- // name of member in instance, parse as MemberNameNode
- case TokenFlag.Member:
- if( _context.TryGetFunction( t.Value, out _ ) ) {
- _cache.PushOperator( t );
- } else if( _local.TryGetMember( t.Value,
- out ExpNode? node ) ) {
- if( node is ExpElementInstanceBase instance ) {
- _cache.PushOperand( instance.MakeReference( t ) );
- return;// ref of an instance
- }
- } else if( TryParseConstant( t ) ) {
- return;
- } else if( TryParseFunction( t ) ) {
- return;
- } else if( TryParseBranch( t ) ) {
- return;
- } else {
- _cache.PushOperand( t );
- }
- break;
- case TokenFlag.Separator_Single: //a , ; found
- // if operator stack is not empty, convert all operators to node until meet a same separator
- // or OperandAheadOfSeparator property is less than certain value
- _cache.PushOperator( t );
- break;
- case TokenFlag.Separator_Left: //a ( [ { found
- // check if the last token is a function name, loop block or branch
- _cache.PushOperator( t );
- break;
- case TokenFlag.Separator_Right: //a } ] ) found
- //Convert operator until meet a matched separator
- while( _cache.TryPopOperator( out Token op ) ) {
- if( IsSeparatorMatch( t, op ) ) {
- if( _cache.OperatorAheadOfDepth == 0 ) {
- _cache.TryPeekOperand(
- out _, out Token tOperand,
- out ExpNode nOperand );
-
- return;
- }
- } else {
- return;
- }
- }
-
- break;
-
-
- case TokenFlag.Index_Left: // a [ found
- _cache.PushOperand( t );
- return;
- case TokenFlag.Index_Right: // a ] found
- while( _cache.TryPopOperator( out Token op ) ) {
- if( op.Value == ExpKeyWord.IndexOf ) { } else { }
- }
- break;
- default:
- break;
- }
- }
-
private bool IsSeparatorMatch( Token source, Token target )
{
return source.Value switch
{
- ExpKeyWord.LeftBrace => target.Value == ExpKeyWord.RightBrace,
- ExpKeyWord.LeftParen => target.Value == ExpKeyWord.RightParen,
- ExpKeyWord.Comma => target.Value == ExpKeyWord.Comma,
- ExpKeyWord.Semicolon => target.Value == ExpKeyWord.Semicolon,
+ ExpKeyword.LeftBrace => target.Value == ExpKeyword.RightBrace,
+ ExpKeyword.LeftParen => target.Value == ExpKeyword.RightParen,
+ ExpKeyword.Comma => target.Value == ExpKeyword.Comma,
+ ExpKeyword.Semicolon => target.Value == ExpKeyword.Semicolon,
_ => false
};
}
+ private bool TryAppendIndexLeft( Token t )
+ {
+ if( t.Flag != TokenFlag.Index_Left ) {
+ return false;
+ }
+ if( _cache.TryPeekOperand(
+ out bool isNode, out _, out ExpNode? node ) ) {
+ if( node.EqualityTypeConvert is not ExpCollectionBase ) {
+ ExpInvalidSyntaxException.ThrowNonCollectionIndex( t );
+ }
+ }
+ _cache.PushOperator( t );
+ _cache.IncreaseDepth( ( int )ExpCompileStateCode.CollectionIndex );
+ return true;
+ }
+
+ private bool TryAppendIndexRight( Token t )
+ {
+ if( t.Flag != TokenFlag.Index_Right ) {
+ return false;
+ }
+
+ //reverse building
+
+ //make index node
+ _cache.PushOperand( ExpCollectionIndexNode.Create( t ) );
+ return true;
+ }
+
private bool TryAppendMember( Token t )
{
if( t.Flag != TokenFlag.Member ) {
@@ -142,6 +104,37 @@ namespace StgSharp.Script.Express
return true;
}
+ private bool TryAppendMiddleSeparator( Token t )
+ {
+ if( t.Flag != TokenFlag.Separator_Middle ) {
+ return false;
+ }
+ if( _cache.OperatorAheadOfDepth == 0 ) {
+ if( _cache.OperandAheadOfDepth == 1 ) {
+ _cache.PushOperand( t );
+ _cache.PushOperator( t );
+ return true;
+ } else {
+ ExpInvalidSyntaxException.ThrowNoOperator( t );
+ }
+ }
+ Token op;
+ processOperator:
+ if( _cache.TryPopOperator( out op ) ) {
+ if( op.Value == t.Value ) {
+ _cache.PopOperand( out _, out ExpNode? node );
+
+ //append node to tail
+ _cache.PushOperand( t );
+ _cache.PushOperator( t );
+ } else {
+ ConvertOneOperator();
+ goto processOperator;
+ }
+ }
+ return true;
+ }
+
private bool TryAppendNumAndStrLiteral( Token t )
{
if( ( t.Flag & ( TokenFlag.String | TokenFlag.Number ) ) == 0 ) {
@@ -160,6 +153,17 @@ namespace StgSharp.Script.Express
return true;
}
+ private bool TryAppendPrefixSeparatorEnd( Token t )
+ {
+ if( t.Flag != TokenFlag.Separator_Right ) {
+ return false;
+ }
+
+ //convert all operator to node until meet a prefix separator
+
+ return true;
+ }
+
private bool TryAppendSymbol( Token t )
{
if( ( t.Flag & ( TokenFlag.Symbol_Unary | TokenFlag.Symbol_Binary ) ) ==
@@ -181,10 +185,10 @@ namespace StgSharp.Script.Express
private bool TryParseConstant( Token t )
{
- if( t.Value == ExpKeyWord.True ) {
+ if( t.Value == ExpKeyword.True ) {
_cache.PushOperand( new ExpBoolNode( t, true ) );
return true;
- } else if( t.Value == ExpKeyWord.False ) {
+ } else if( t.Value == ExpKeyword.False ) {
_cache.PushOperand( new ExpBoolNode( t, false ) );
return true;
}
@@ -193,7 +197,7 @@ namespace StgSharp.Script.Express
private bool TryParseFunction( Token t )
{
- if( ExpKeyWord.BuiltinFunctions.Contains( t.Value ) ) {
+ if( ExpKeyword.BuiltinFunctions.Contains( t.Value ) ) {
_cache.PushOperator( t );
return true;
} else if( _context.TryGetFunction(
@@ -207,7 +211,7 @@ namespace StgSharp.Script.Express
private bool TryParseInstance( Token t )
{
if( _local.TryGetMember( t.Value,
- out ExpNode? node ) && node is ExpElementInstanceNode instance ) {
+ out ExpNode? node ) && node is ExpElementInstanceBase instance ) {
_cache.PushOperand(
ExpInstanceReferenceNode.Create( t, instance ) );
return true;
diff --git a/StgSharp.Script/Express/ExpNodeGenerator.cs b/StgSharp.Script/Express/ExpNodeGenerator.cs
index d6eba1b3..d47d7dd9 100644
--- a/StgSharp.Script/Express/ExpNodeGenerator.cs
+++ b/StgSharp.Script/Express/ExpNodeGenerator.cs
@@ -28,16 +28,19 @@
//
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+
using StgSharp.Threading;
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.IO.Pipes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
-using ExpKeyWord = StgSharp.Script.Express.ExpCompile.KeyWord;
+using ExpKeyword = StgSharp.Script.Express.ExpCompile.KeyWord;
namespace StgSharp.Script.Express
{
@@ -68,7 +71,28 @@ namespace StgSharp.Script.Express
///
public void AppendToken( Token expToken )
{
- switch( _cache.CurrentDepthMark.State ) {
+ switch( expToken.Flag ) {
+ case TokenFlag.Symbol_Unary or TokenFlag.Symbol_Binary:
+ TryAppendSymbol( expToken );
+ break;
+ case TokenFlag.Member:
+ TryAppendMember( expToken );
+ break;
+ case TokenFlag.Separator_Left:
+ TryAppendPrefixSeparator( expToken );
+ break;
+ case TokenFlag.Separator_Right:
+ TryAppendPrefixSeparatorEnd( expToken );
+ break;
+ case TokenFlag.Separator_Middle:
+ TryAppendMiddleSeparator( expToken );
+ break;
+ case TokenFlag.Index_Left:
+ TryAppendIndexLeft( expToken );
+ break;
+ case TokenFlag.Index_Right:
+ TryAppendIndexRight( expToken );
+ break;
default:
break;
}
@@ -83,28 +107,6 @@ namespace StgSharp.Script.Express
throw new NotImplementedException();
}
- ///
- /// 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;
- }
- }
-
/**/
public enum ExpCompileStateCode
@@ -118,6 +120,7 @@ namespace StgSharp.Script.Express
CaseBranch,
PrefixSeparator,
MiddleSeparator,
+ CollectionIndex,
}
diff --git a/StgSharp.Script/Express/ExpSourceReader.cs b/StgSharp.Script/Express/ExpSourceReader.cs
index 28bf2cbf..7cf2368f 100644
--- a/StgSharp.Script/Express/ExpSourceReader.cs
+++ b/StgSharp.Script/Express/ExpSourceReader.cs
@@ -77,10 +77,10 @@ namespace StgSharp.Script.Express
}
///
- /// Read code until end of a line. Lines in multi-line comment will be ignored. Line
+ /// Read code until end of a line. Lines in multi-line comment will be ignored. Line
/// begins with part of multi-line comment will automatically remove the comment part, but
- /// beginning with a full multi-line comment will not causing removing. (*Just
- /// Like The Comment Here*) Will Not Be Removed
+ /// beginning with a full multi-line comment will not causing removing. (*Just
+ /// Like The Comment Here*) Will Not Be Removed
///
///
public unsafe ReadOnlySpan ReadLine()
@@ -246,7 +246,7 @@ namespace StgSharp.Script.Express
_current++;
return new Token(
ExpCompile.PoolString( source[ ..1 ] ), _lineNum,
- begin, TokenFlag.Separator_Single );
+ begin, TokenFlag.Separator_Middle );
case ':' or '+' or '/' or '\\' or '*' or '.':
begin = _current;
_current++;
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 dd7f7dd1..5c6a2c48 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+e3741687a706609a1d0055c3fd11f41945838a70")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6788bc4a0065508d7afa5f740da1b4ca6dd1efef")]
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Script")]
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Script")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.sourcelink.json b/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.sourcelink.json
index 03e04358..2eeaae6f 100644
--- a/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.sourcelink.json
+++ b/StgSharp.Script/obj/x64/Debug/net8.0/StgSharp.Script.sourcelink.json
@@ -1 +1 @@
-{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/e3741687a706609a1d0055c3fd11f41945838a70/*"}}
\ No newline at end of file
+{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/6788bc4a0065508d7afa5f740da1b4ca6dd1efef/*"}}
\ No newline at end of file
diff --git a/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.AssemblyInfo.cs b/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.AssemblyInfo.cs
index 0f6439b7..251baac4 100644
--- a/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.AssemblyInfo.cs
+++ b/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.AssemblyInfo.cs
@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharp.TerminalDialogue")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e3741687a706609a1d0055c3fd11f41945838a70")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6788bc4a0065508d7afa5f740da1b4ca6dd1efef")]
[assembly: System.Reflection.AssemblyProductAttribute("StgSharp.TerminalDialogue")]
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.TerminalDialogue")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.sourcelink.json b/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.sourcelink.json
index 03e04358..2eeaae6f 100644
--- a/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.sourcelink.json
+++ b/StgSharp.TerminalDialogue/obj/x64/Debug/StgSharp.TerminalDialogue.sourcelink.json
@@ -1 +1 @@
-{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/e3741687a706609a1d0055c3fd11f41945838a70/*"}}
\ No newline at end of file
+{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/6788bc4a0065508d7afa5f740da1b4ca6dd1efef/*"}}
\ No newline at end of file
diff --git a/StgSharpDebug/Program.cs b/StgSharpDebug/Program.cs
index bb99008e..2df24694 100644
--- a/StgSharpDebug/Program.cs
+++ b/StgSharpDebug/Program.cs
@@ -49,7 +49,7 @@ using System.Xml.XPath;
namespace StgSharp
{
- internal static class Program
+ internal static partial class Program
{
private static string testExpPath = @"D:\Programmer\stepcode\data\ap203\ap203.exp";
@@ -59,42 +59,35 @@ namespace StgSharp
try {
StgSharp.Init();
- /**/
- ExpCompile.InitCompile();
- ExpFileSource reader = new ExpFileSource( testExpPath );
- ExpSchemaSource schemaSource = new ExpSchemaSource();
- schemaSource.ReadSchema( reader );
+ CompileStack stack = new CompileStack(
+ );
- ExpSchema schema = schemaSource.Compile(
- ExpressCompileOption.Translate );
+ for( int i = 0; i < 10; i++ ) {
+ stack.PushOperand(
+ new Token( $"{i}", 0, 0, TokenFlag.Number ) );
+ }
+ for( int i = 0; i < 10; i++ ) {
+ stack.PushOperator(
+ new Token( $"op_{i}", 0, 0, TokenFlag.Member ) );
+ }
+ stack.IncreaseDepth( 0 );
- /**/
- /*
-
- StgSharp.InitGL( 4, 6 );
- StgSharp.GlobalSetting.VSyncActivated = false;
-
- ViewPort vp = new ViewPort(
- 800, 600, "Hello StgSharp!", IntPtr.Zero );
-
- //throw new NotImplementedException();
-
- StringHashMultiplexer mul = new StringHashMultiplexer();
- IEqualityComparer com = mul;
- string str = "1234567012345670";
- for( int i = 1; i < 100; i++ ) {
- str += $"{(i%8)}";
- int hash = mul.ForceComputeHash( str );
- Thread.Sleep( 20 );
+ for( int i = 0; i < 10; i++ ) {
+ stack.PushOperand(
+ new Token( $"{i}", 0, 0, TokenFlag.Number ) );
+ }
+ for( int i = 0; i < 10; i++ ) {
+ stack.PushOperator(
+ new Token( $"op_{i}", 0, 0, TokenFlag.Member ) );
}
- ViewModelBase mainModel = new ViewModelMain( vp );
- mainModel.CreateAndBindView( "MainView", (1, 1, 1) );
-
- mainModel.UseViewModel( "MainView" );
-
- StgSharp.Terminate();
- /**/
+ while( stack.TryPopOperand(
+ out bool isNode, out Token t, out ExpNode n ) ) {
+ Console.WriteLine( t.Value );
+ }
+ while( stack.TryPopOperator( out Token op ) ) {
+ Console.WriteLine( op.Value );
+ }
return;
}
diff --git a/StgSharpDebug/TestFileRead.cs b/StgSharpDebug/TestFileRead.cs
new file mode 100644
index 00000000..6b242102
--- /dev/null
+++ b/StgSharpDebug/TestFileRead.cs
@@ -0,0 +1,56 @@
+//-----------------------------------------------------------------------
+//-----------------------------------------------------------------------
+// file="TestFileRead.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.Script.Express;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StgSharp
+{
+ internal static partial class Program
+ {
+
+ private static void TestFileRead()
+ {
+ ExpCompile.InitCompile();
+ ExpFileSource reader = new ExpFileSource( testExpPath );
+ ExpSchemaSource schemaSource = new ExpSchemaSource();
+ schemaSource.ReadSchema( reader );
+
+ ExpSchema schema = schemaSource.Compile(
+ ExpressCompileOption.Translate );
+ }
+
+ }
+}
diff --git a/StgSharpDebug/TestRender.cs b/StgSharpDebug/TestRender.cs
new file mode 100644
index 00000000..9096d24a
--- /dev/null
+++ b/StgSharpDebug/TestRender.cs
@@ -0,0 +1,74 @@
+//-----------------------------------------------------------------------
+//-----------------------------------------------------------------------
+// file="TestRender.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.MVVM;
+using StgSharp.MVVM.ViewModel;
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StgSharp
+{
+ internal static partial class Program
+ {
+
+ public static void TestRender()
+ {
+ StgSharp.InitGL( 4, 6 );
+ StgSharp.GlobalSetting.VSyncActivated = false;
+
+ ViewPort vp = new ViewPort(
+ 800, 600, "Hello StgSharp!", IntPtr.Zero );
+
+ //throw new NotImplementedException();
+
+ StringHashMultiplexer mul = new StringHashMultiplexer();
+ IEqualityComparer com = mul;
+ string str = "1234567012345670";
+ for( int i = 1; i < 100; i++ ) {
+ str += $"{(i % 8)}";
+ int hash = mul.ForceComputeHash( str );
+ Thread.Sleep( 20 );
+ }
+
+ ViewModelBase mainModel = new ViewModelMain( vp );
+ mainModel.CreateAndBindView( "MainView", (1, 1, 1) );
+
+ mainModel.UseViewModel( "MainView" );
+
+ StgSharp.Terminate( 0 );
+ }
+
+ }
+}
diff --git a/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.AssemblyInfo.cs b/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.AssemblyInfo.cs
index 436379e0..8f7cea26 100644
--- a/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.AssemblyInfo.cs
+++ b/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.AssemblyInfo.cs
@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("StgSharpDebug")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e3741687a706609a1d0055c3fd11f41945838a70")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6788bc4a0065508d7afa5f740da1b4ca6dd1efef")]
[assembly: System.Reflection.AssemblyProductAttribute("StgSharpDebug")]
[assembly: System.Reflection.AssemblyTitleAttribute("StgSharpDebug")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.sourcelink.json b/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.sourcelink.json
index 03e04358..2eeaae6f 100644
--- a/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.sourcelink.json
+++ b/StgSharpDebug/obj/x64/Debug/net8.0/StgSharpDebug.sourcelink.json
@@ -1 +1 @@
-{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/e3741687a706609a1d0055c3fd11f41945838a70/*"}}
\ No newline at end of file
+{"documents":{"D:\\NitloadIndustry\\研究项目\\1-Flagship\\TH2020\\ProjectFile\\内核源代码\\*":"https://raw.githubusercontent.com/Nitload-NSI/CCD_Github/6788bc4a0065508d7afa5f740da1b4ca6dd1efef/*"}}
\ No newline at end of file