apply context for find invoke symbol

master
xieguigang 5 years ago
parent d61bd83fc5
commit 04ca7a6b29

@ -1,6 +0,0 @@
Namespace Interpreter
Public Class Executable
End Class
End Namespace

@ -0,0 +1,11 @@
Imports LINQ.Runtime
Namespace Interpreter
Public Class ExecutableContext
Public Property env As Environment
Public Property throwError As Boolean = True
End Class
End Namespace

@ -10,11 +10,11 @@ Namespace Interpreter.Expressions
Me.seq = seq.ToArray
End Sub
Public Overrides Function Exec(env As Environment) As Object
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim list As New List(Of Object)
For Each item In seq
list.Add(item.Exec(env))
list.Add(item.Exec(context))
Next
Return list.ToArray

@ -23,9 +23,9 @@ Namespace Interpreter.Expressions
Me.op = op
End Sub
Public Overrides Function Exec(env As Environment) As Object
Dim x As Object = left.Exec(env)
Dim y As Object = right.Exec(env)
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim x As Object = left.Exec(context)
Dim y As Object = right.Exec(context)
Select Case op
Case "+" : Return x + y

@ -6,11 +6,11 @@ Namespace Interpreter.Expressions
Public ReadOnly Property name As String
Get
Return MyClass.GetType.Name
Return MyClass.GetType.Name.ToLower
End Get
End Property
Public MustOverride Function Exec(env As Environment) As Object
Public MustOverride Function Exec(context As ExecutableContext) As Object
End Class
End Namespace

@ -7,15 +7,20 @@ Namespace Interpreter.Expressions
Public Property func As Expression
Public Property parameters As Expression()
Public Overrides Function Exec(env As Environment) As Object
Dim invoke As Object = func.Exec(env)
Sub New(func As Expression, parameters As IEnumerable(Of Expression))
Me.func = func
Me.parameters = parameters.ToArray
End Sub
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim invoke As Object = func.Exec(New ExecutableContext With {.env = context.env, .throwError = False})
If invoke Is Nothing Then
Throw New NullReferenceException
ElseIf TypeOf invoke Is String Then
invoke = env.FindInvoke(invoke)
invoke = context.env.FindInvoke(invoke)
ElseIf TypeOf invoke Is SymbolReference Then
invoke = env.FindInvoke(DirectCast(invoke, SymbolReference).symbolName)
invoke = context.env.FindInvoke(DirectCast(invoke, SymbolReference).symbolName)
Else
Throw New NotImplementedException
End If
@ -23,12 +28,16 @@ Namespace Interpreter.Expressions
Dim args As New List(Of Object)
For Each item In parameters
args.Add(item.Exec(env))
args.Add(item.Exec(context))
Next
Dim result As Object = invoke(args.ToArray)
Return result
End Function
Public Overrides Function ToString() As String
Return $"{func}({parameters.JoinBy(", ")})"
End Function
End Class
End Namespace

@ -18,19 +18,21 @@ Namespace Interpreter.Expressions
Me.key = FixLiteral(key)
End Sub
Public Overrides Function Exec(env As Environment) As Object
Return key.Exec(env)
Public Overrides Function Exec(context As ExecutableContext) As Object
Return key.Exec(context)
End Function
Private Function GetOrderKey(obj As JavaScriptObject, env As Environment) As Object
Private Function GetOrderKey(obj As JavaScriptObject, context As ExecutableContext) As Object
Dim env As Environment = context.env
For Each key As String In obj
env.FindSymbol(key).value = obj(key)
Next
Return Exec(env)
Return Exec(context)
End Function
Public Overrides Function Exec(result As IEnumerable(Of JavaScriptObject), env As Environment) As IEnumerable(Of JavaScriptObject)
Public Overrides Function Exec(result As IEnumerable(Of JavaScriptObject), context As ExecutableContext) As IEnumerable(Of JavaScriptObject)
Dim raw As JavaScriptObject() = result.ToArray
Dim keys As Object()
Dim i As Integer()
@ -42,7 +44,7 @@ Namespace Interpreter.Expressions
Else
keys = raw _
.Select(Function(obj)
Return GetOrderKey(obj, env)
Return GetOrderKey(obj, context)
End Function) _
.ToArray
End If

@ -5,7 +5,7 @@ Namespace Interpreter.Expressions
Public MustInherit Class PipelineKeyword : Inherits KeywordExpression
Public MustOverride Overloads Function Exec(result As IEnumerable(Of JavaScriptObject), env As Environment) As IEnumerable(Of JavaScriptObject)
Public MustOverride Overloads Function Exec(result As IEnumerable(Of JavaScriptObject), context As ExecutableContext) As IEnumerable(Of JavaScriptObject)
''' <summary>
'''

@ -18,12 +18,12 @@ Namespace Interpreter.Expressions
Me.n = n
End Sub
Public Overrides Function Exec(result As IEnumerable(Of JavaScriptObject), env As Environment) As IEnumerable(Of JavaScriptObject)
Return result.Take(count:=CInt(Exec(env)))
Public Overrides Function Exec(result As IEnumerable(Of JavaScriptObject), context As ExecutableContext) As IEnumerable(Of JavaScriptObject)
Return result.Take(count:=CInt(Exec(context)))
End Function
Public Overrides Function Exec(env As Environment) As Object
Return n.Exec(env)
Public Overrides Function Exec(context As ExecutableContext) As Object
Return n.Exec(context)
End Function
End Class
End Namespace

@ -18,11 +18,11 @@ Namespace Interpreter.Expressions
Me.fields = fields.ToArray
End Sub
Public Overrides Function Exec(env As Environment) As Object
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim obj As New JavaScriptObject
For Each field In fields
obj(field.Name) = field.Value.Exec(env)
obj(field.Name) = field.Value.Exec(context)
Next
Return obj

@ -13,7 +13,7 @@ Namespace Interpreter.Expressions
End Get
End Property
Public Overrides Function Exec(env As Environment) As Object
Public Overrides Function Exec(context As ExecutableContext) As Object
Throw New NotImplementedException()
End Function

@ -16,8 +16,8 @@ Namespace Interpreter.Expressions
Me.filter = filter
End Sub
Public Overrides Function Exec(env As Environment) As Object
Return filter.Exec(env)
Public Overrides Function Exec(context As ExecutableContext) As Object
Return filter.Exec(context)
End Function
Public Overrides Function ToString() As String

@ -30,7 +30,7 @@ Namespace Interpreter.Expressions
End Select
End Sub
Public Overrides Function Exec(env As Environment) As Object
Public Overrides Function Exec(context As ExecutableContext) As Object
Return value
End Function

@ -21,8 +21,8 @@ Namespace Interpreter.Expressions
End If
End Sub
Public Overrides Function Exec(env As Environment) As Object
Dim symbol As Object = Me.symbol.Exec(env)
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim symbol As Object = Me.symbol.Exec(context)
If symbol Is Nothing Then
Throw New NullReferenceException

@ -10,11 +10,15 @@ Namespace Interpreter.Expressions
Me.symbolName = name
End Sub
Public Overrides Function Exec(env As Environment) As Object
Dim symbol As Symbol = env.FindSymbol(symbolName)
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim symbol As Symbol = context.env.FindSymbol(symbolName)
If symbol Is Nothing Then
Throw New MissingPrimaryKeyException(symbolName)
If context.throwError Then
Throw New MissingPrimaryKeyException(symbolName)
Else
Return Nothing
End If
Else
Return symbol.value
End If

@ -12,7 +12,7 @@ Namespace Interpreter.Query
Call MyBase.New(symbol, sequence, exec)
End Sub
Public Overrides Function Exec(env As Environment) As Object
Public Overrides Function Exec(context As ExecutableContext) As Object
Throw New NotImplementedException()
End Function
End Class

@ -16,11 +16,13 @@ Namespace Interpreter.Query
Public MustOverride Function PopulatesData() As IEnumerable(Of Object)
Public Shared Function CreateDataSet(query As QueryExpression, env As Environment) As DataSet
Public Shared Function CreateDataSet(query As QueryExpression, context As ExecutableContext) As DataSet
Dim env As Environment = context.env
If query.IsURISource Then
Return New URIIteratorDriver(query, query.GetSeqValue(Nothing), env)
Else
Dim seqVal As Object = query.GetSeqValue(env)
Dim seqVal As Object = query.GetSeqValue(context)
If TypeOf seqVal Is String Then
Return New URIIteratorDriver(query, seqVal, env)

@ -15,9 +15,10 @@ Namespace Interpreter.Query
.ToArray
End Sub
Public Function RunOptionPipeline(output As IEnumerable(Of JavaScriptObject), env As Environment) As IEnumerable(Of JavaScriptObject)
Public Function RunOptionPipeline(output As IEnumerable(Of JavaScriptObject), context As ExecutableContext) As IEnumerable(Of JavaScriptObject)
Dim raw As JavaScriptObject() = output.ToArray
Dim allNames As String() = raw(Scan0).GetNames
Dim env As Environment = context.env
For Each name As String In allNames
If Not env.HasSymbol(name) Then
@ -26,7 +27,7 @@ Namespace Interpreter.Query
Next
For Each line As PipelineKeyword In pipeline
raw = line.Exec(raw, env).ToArray
raw = line.Exec(raw, context).ToArray
Next
Return raw
@ -52,20 +53,24 @@ Namespace Interpreter.Query
''' <summary>
'''
''' </summary>
''' <param name="env"></param>
''' <param name="context"></param>
''' <returns>
''' array of <see cref="JavaScriptObject"/>
''' </returns>
Public Overrides Function Exec(env As Environment) As Object
Public Overrides Function Exec(context As ExecutableContext) As Object
Dim projections As New List(Of JavaScriptObject)
Dim closure As New Environment(parent:=env)
Dim env As Environment = context.env
Dim closure As New ExecutableContext With {
.env = New Environment(parent:=env),
.throwError = context.throwError
}
Dim skipVal As Boolean
Dim dataset As DataSet = GetDataSet(env)
Dim dataset As DataSet = GetDataSet(context)
Call closure.AddSymbol(symbol.symbolName, symbol.type)
Call closure.env.AddSymbol(symbol.symbolName, symbol.type)
For Each item As Object In dataset.PopulatesData()
closure.FindSymbol(symbol.symbolName).value = item
closure.env.FindSymbol(symbol.symbolName).value = item
For Each line As Expression In executeQueue
If TypeOf line Is WhereFilter Then
@ -82,7 +87,7 @@ Namespace Interpreter.Query
End If
Next
Return opt.RunOptionPipeline(projections, env).ToArray
Return opt.RunOptionPipeline(projections, context).ToArray
End Function
End Class
End Namespace

@ -22,12 +22,12 @@ Namespace Interpreter.Query
Me.executeQueue = execQueue.ToArray
End Sub
Public Function GetSeqValue(env As Environment) As Object
Return sequence.Exec(env)
Public Function GetSeqValue(context As ExecutableContext) As Object
Return sequence.Exec(context)
End Function
Protected Function GetDataSet(env As Environment) As DataSet
Return DataSet.CreateDataSet(Me, env)
Protected Function GetDataSet(context As ExecutableContext) As DataSet
Return DataSet.CreateDataSet(Me, context)
End Function
End Class
End Namespace

@ -155,7 +155,7 @@
<Import Include="System.Threading.Tasks" />
</ItemGroup>
<ItemGroup>
<Compile Include="Interpreter\Executable.vb" />
<Compile Include="Interpreter\ExecutableContext.vb" />
<Compile Include="Interpreter\Expressions\BinaryExpression.vb" />
<Compile Include="Interpreter\Expressions\ArrayExpression.vb" />
<Compile Include="Interpreter\Expressions\FuncEval.vb" />

@ -1,4 +1,5 @@
Imports LINQ.Interpreter.Query
Imports LINQ.Interpreter
Imports LINQ.Interpreter.Query
Imports LINQ.Runtime
Imports LINQ.Script
Imports Microsoft.VisualBasic.ApplicationServices.Terminal
@ -16,7 +17,7 @@ Module Program
Dim tokens = LINQ.Language.GetTokens(file.ReadAllText).ToArray
Dim query As ProjectionExpression = tokens.PopulateQueryExpression
Dim env As New GlobalEnvironment(New Registry)
Dim result As JavaScriptObject() = query.Exec(env)
Dim result As JavaScriptObject() = query.Exec(New ExecutableContext With {.env = env, .throwError = True})
Dim table As DataFrame = result.CreateTableDataSet
Dim text As String()() = table _
.csv _

@ -58,7 +58,7 @@ Namespace Runtime
ElseIf Not parent Is Nothing Then
Return parent.FindSymbol(name)
Else
Throw New MissingPrimaryKeyException(name)
Return Nothing
End If
End Function

@ -7,6 +7,7 @@ Namespace Runtime
Public Shared ReadOnly abs As New Callable(AddressOf stdnum.Abs)
Public Shared ReadOnly min As New Callable(AddressOf stdnum.Min)
Public Shared ReadOnly max As New Callable(AddressOf stdnum.Max)
Public Shared ReadOnly pow As New Callable(AddressOf stdnum.Pow)
End Class
End Namespace

@ -168,6 +168,11 @@ Namespace Script
End If
End Function
<Extension>
Private Function IsClosure(tokenList As Token()) As Boolean
Return tokenList(Scan0).name = Tokens.Open AndAlso tokenList.Last.name = Tokens.Close
End Function
<Extension>
Public Function ParseExpression(tokenList As Token()) As Expression
If tokenList.Length = 1 Then
@ -189,6 +194,12 @@ Namespace Script
.Take(tokenList.Length - 2) _
.ToArray
End If
ElseIf blocks.Length = 2 Then
Dim name As Expression = ParseExpression(blocks(Scan0))
If TypeOf name Is SymbolReference AndAlso blocks(1).IsClosure Then
Return New FuncEval(name, blocks(1).Skip(1).Take(blocks(1).Length - 2).GetParameters)
End If
End If
Return tokenList.ParseBinary

@ -3,6 +3,7 @@ Imports LINQ.Runtime
Imports Microsoft.VisualBasic.ComponentModel.DataSourceModel
Imports LINQ.Interpreter.Query
Imports Microsoft.VisualBasic.My.JavaScript
Imports LINQ.Interpreter
Public Module Program
@ -27,7 +28,7 @@ order by y
Dim query As ProjectionExpression = tokens.PopulateQueryExpression
Dim env As New GlobalEnvironment(New Registry, New NamedValue(Of Object)("y", 1))
Dim result As JavaScriptObject() = query.Exec(env)
Dim result As JavaScriptObject() = query.Exec(New ExecutableContext With {.env = env, .throwError = True})
Dim table = result.CreateTableDataSet
Pause()

Loading…
Cancel
Save