diff --git a/StgSharp.C/mat4.c b/StgSharp.C/mat4.c index b7b322d4..5982adc4 100644 --- a/StgSharp.C/mat4.c +++ b/StgSharp.C/mat4.c @@ -100,4 +100,4 @@ INTERNAL void SSCDECL submatrix4_avx(__4_columnset *left, __4_columnset *right, INTERNAL void SSCDECL submatrix4_512(__4_columnset *left, __4_columnset *right, __4_columnset *ans) { ans->stream = _mm512_sub_ps(ALIGN512(left->stream), ALIGN512(right->stream)); -} +} diff --git a/StgSharp.Script/Express/CompileEnv/DefaultSchema.cs b/StgSharp.Script/Express/CompileEnv/DefaultSchema.cs index 9df8c128..d0b96b72 100644 --- a/StgSharp.Script/Express/CompileEnv/DefaultSchema.cs +++ b/StgSharp.Script/Express/CompileEnv/DefaultSchema.cs @@ -75,6 +75,11 @@ namespace StgSharp.Script.Express return FunctionDict.TryGetValue( name, out f! ); } + public override bool TryGetProcedure( string name, out ExpProcedureSource p ) + { + return ProcedureDict.TryGetValue( name, out p! ); + } + public override bool TryGetRule( string name, out ExpRuleSource r ) { r = null!; diff --git a/StgSharp.Script/Express/CompileEnv/KeyWord.cs b/StgSharp.Script/Express/CompileEnv/KeyWord.cs index 3663d381..eb320d3e 100644 --- a/StgSharp.Script/Express/CompileEnv/KeyWord.cs +++ b/StgSharp.Script/Express/CompileEnv/KeyWord.cs @@ -70,7 +70,7 @@ namespace StgSharp.Script.Express Backslash, IndexOf, RightBracket, LeftBrace, RightBrace, Pipe, LeftParen, RightParen, LeftAsterisk, Assignment, DoublePipe, ExpSymbole, CommentSingleLine, - CommentStart, CommentEnd, ColonEqualColon, ColonNotEqualColon + CommentStart, CommentEnd, InstanceEqual, InstanceNotEqual ]; public static HashSet DataTypes { get; } = [ @@ -346,8 +346,8 @@ namespace StgSharp.Script.Express public const string CommentSingleLine = "--"; public const string CommentStart = "(*"; public const string CommentEnd = "*)"; - public const string ColonEqualColon = ":=:"; - public const string ColonNotEqualColon = ":<>:"; + public const string InstanceEqual = ":=:"; + public const string InstanceNotEqual = ":<>:"; #endregion } diff --git a/StgSharp.Script/Express/Element/ExpProcedureSource.cs b/StgSharp.Script/Express/Element/ExpProcedureSource.cs new file mode 100644 index 00000000..98c212cb --- /dev/null +++ b/StgSharp.Script/Express/Element/ExpProcedureSource.cs @@ -0,0 +1,64 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpProcedureSource.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 class ExpProcedureSource : ExpImmutableElement + { + + public override ExpElementType ElementType => ExpElementType.Procedure; + + public override IScriptSourceProvider SourceProvider => throw new NotImplementedException(); + + public override string Name => throw new NotImplementedException(); + + public override void Analyse() + { + throw new NotImplementedException(); + } + + public override ExpNode MakeReference( params object[] options ) + { + throw new NotImplementedException(); + } + + public override bool TryGetMember( string name, out ExpNode memberNode ) + { + throw new NotImplementedException(); + } + + } +} diff --git a/StgSharp.Script/Express/ExpAstNode/ExpBinaryOperatorNode.cs b/StgSharp.Script/Express/ExpAstNode/ExpBinaryOperatorNode.cs index dc8dad34..21615bde 100644 --- a/StgSharp.Script/Express/ExpAstNode/ExpBinaryOperatorNode.cs +++ b/StgSharp.Script/Express/ExpAstNode/ExpBinaryOperatorNode.cs @@ -28,6 +28,8 @@ // //----------------------------------------------------------------------- //----------------------------------------------------------------------- +using Microsoft.CodeAnalysis.CSharp; + using System; using System.Collections.Generic; using System.Data.Common; @@ -89,10 +91,40 @@ namespace StgSharp.Script.Express }; } - public static ExpBinaryOperatorNode ConvertElement( Token source, ExpNode left, ExpNode right ) + public static ExpBinaryOperatorNode CompareInstanceEqual( + Token source, + ExpNode left, + ExpNode right ) + { + return new ExpBinaryOperatorNode( source, left, right ) + { + _returnType = ExpressCompile.ExpBool, + _nodeFlag = ExpNodeFlag.BuiltinType_Boolean | ExpNodeFlag.Operator_Binary, + CodeConvertTemplate = "!ReferenceEquals({0}, {1})", + }; + } + + public static ExpBinaryOperatorNode CompareInstanceNotEqual( + Token nsource, + ExpNode left, + ExpNode right ) + { + return new ExpBinaryOperatorNode( nsource, left, right ) + { + _returnType = ExpressCompile.ExpBool, + _nodeFlag = ExpNodeFlag.BuiltinType_Boolean | ExpNodeFlag.Operator_Binary, + CodeConvertTemplate = "ReferenceEquals({0}, {1})", + }; + } + + public static ExpBinaryOperatorNode ConvertElement( + Token source, + ExpNode left, + ExpNode right ) { if( right is not ExpMetaRefNode metaref ) { - throw new ExpInvalidTypeException( "", right.EqualityTypeConvert.Name ); + throw new ExpInvalidTypeException( + "", right.EqualityTypeConvert.Name ); } return new ExpBinaryOperatorNode( source, left, right ) { diff --git a/StgSharp.Script/Express/ExpAstNode/ExpProcedureCallingNode.cs b/StgSharp.Script/Express/ExpAstNode/ExpProcedureCallingNode.cs new file mode 100644 index 00000000..00039990 --- /dev/null +++ b/StgSharp.Script/Express/ExpAstNode/ExpProcedureCallingNode.cs @@ -0,0 +1,78 @@ +//----------------------------------------------------------------------- +//----------------------------------------------------------------------- +// file="ExpProcedureCallingNode.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.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace StgSharp.Script.Express +{ + public class ExpProcedureCallingNode : ExpNode + { + + private ExpNode _params; + + public ExpProcedureCallingNode( Token source, ExpProcedureSource caller, ExpNode param ) + : base( source ) + { + _params = param; + CalledProcedure = caller; + } + + public override ExpNode Left => Empty; + + public override ExpNode Right => _params; + + public ExpProcedureSource CalledProcedure { get; init; } + + public override IExpElementSource EqualityTypeConvert => ExpInstantiableElement.Void; + + public static ExpProcedureCallingNode CallProcedure( + Token postion, + ExpProcedureSource caller, + ExpNode input ) + { + ExpProcedureCallingNode node = new ExpProcedureCallingNode( postion, caller, input ) + { + /* + * 0. parameters + */ + CodeConvertTemplate = $$""" + {{caller.Name}}( {0} ) + """ + }; + return node; + } + + } +} diff --git a/StgSharp.Script/Express/ExpSchemaBase.cs b/StgSharp.Script/Express/ExpSchemaBase.cs index 23838ee1..d7bc9fd3 100644 --- a/StgSharp.Script/Express/ExpSchemaBase.cs +++ b/StgSharp.Script/Express/ExpSchemaBase.cs @@ -32,6 +32,7 @@ using StgSharp.Collections; using System; using System.Collections; +using System.Collections.Concurrent; using System.Collections.Frozen; using System.Collections.Generic; using System.Linq; @@ -56,6 +57,8 @@ namespace StgSharp.Script.Express public abstract bool TryGetFunction( string name, out ExpFunctionSource f ); + public abstract bool TryGetProcedure( string name, out ExpProcedureSource p ); + public abstract bool TryGetRule( string name, out ExpRuleSource r ); public abstract bool TryGetSchemaInclude( string name, out ExpSchema include ); @@ -73,6 +76,8 @@ namespace StgSharp.Script.Express protected ConcurrentStringHashMultiplexer StringMultiplexer => ExpressCompile.Multiplexer; + protected ConcurrentDictionary ProcedureDict { get; set; } + protected FrozenDictionary RuleDict { get; set; } protected FrozenDictionary SchemaInclude { get; set; } diff --git a/StgSharp.Script/Express/ExpSyntaxAnalyzer.OperatorParser.cs b/StgSharp.Script/Express/ExpSyntaxAnalyzer.OperatorParser.cs index 9503de2f..5442d158 100644 --- a/StgSharp.Script/Express/ExpSyntaxAnalyzer.OperatorParser.cs +++ b/StgSharp.Script/Express/ExpSyntaxAnalyzer.OperatorParser.cs @@ -97,11 +97,23 @@ namespace StgSharp.Script.Express t, "An ExpNode for function calling is needed, but a token was popped" ); } + } else if( _context.TryGetProcedure( op.Value, out ExpProcedureSource? p ) ) + { + if( !_cache.PopOperand( out Token t, out ExpNode? param ) ) + { + node = ExpProcedureCallingNode.CallProcedure( op, p, param ); + return node; + } else + { + throw new ExpCompileException( + t, + "An ExpNode for function calling is needed, but a token was popped" ); + } } else if( ExpSchema.BuiltinSchema.TryGetFunction( op.Value, out f ) ) { - if( !_cache.PopOperand( out Token t, out ExpNode? p ) ) + if( !_cache.PopOperand( out Token t, out ExpNode? param ) ) { - node = ExpFunctionCallingNode.CallFunction( op, f, p ); + node = ExpFunctionCallingNode.CallFunction( op, f, param ); return node; } else { @@ -153,6 +165,12 @@ namespace StgSharp.Script.Express case ExpKeyword.Assignment: node = ExpBinaryOperatorNode.Assign( t, left, right ); return true; + case ExpKeyword.InstanceEqual: + node = ExpBinaryOperatorNode.CompareInstanceEqual( t, left, right ); + return true; + case ExpKeyword.InstanceNotEqual: + node = ExpBinaryOperatorNode.CompareInstanceNotEqual( t, left, right ); + return true; default: node = ExpNode.Empty; return false; diff --git a/StgSharp.Script/Express/GeneratedExpSchema.cs b/StgSharp.Script/Express/GeneratedExpSchema.cs index a335f975..333fd4a3 100644 --- a/StgSharp.Script/Express/GeneratedExpSchema.cs +++ b/StgSharp.Script/Express/GeneratedExpSchema.cs @@ -78,17 +78,22 @@ namespace StgSharp.Script.Express public override bool TryGetConst( string name, out ExpElementInstance c ) { - return ConstDict.TryGetValue( name, out c ); + return ConstDict.TryGetValue( name, out c! ); } public override bool TryGetEntity( string name, out ExpEntitySource e ) { - return EntityDict.TryGetValue( name, out e ); + return EntityDict.TryGetValue( name, out e! ); } public override bool TryGetFunction( string name, out ExpFunctionSource f ) { - return FunctionDict.TryGetValue( name, out f ); + return FunctionDict.TryGetValue( name, out f! ); + } + + public override bool TryGetProcedure( string name, out ExpProcedureSource p ) + { + throw new NotImplementedException(); } public override bool TryGetRule( string name, out ExpRuleSource r ) 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 acb6cca1..744f594d 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+7b7b5ee475ba81a574fedf4772a213a798ba4c27")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a4b2e9a8056c03f25a0aa3136f09d28ba86763fe")] [assembly: System.Reflection.AssemblyProductAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyTitleAttribute("StgSharp.Script")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/StgSharpDebug/ExpLinearExpressionTest.cs b/StgSharpDebug/ExpLinearExpressionTest.cs index 812b1fce..28cc5572 100644 --- a/StgSharpDebug/ExpLinearExpressionTest.cs +++ b/StgSharpDebug/ExpLinearExpressionTest.cs @@ -98,6 +98,12 @@ namespace StgSharp return false; } + public override bool TryGetProcedure( string name, out ExpProcedureSource p ) + { + p = null; + return false; + } + public override bool TryGetRule( string name, out ExpRuleSource r ) { r = null;