Einfacher Formelparser in Visual Basic .NET?

1 Antwort

Du kannst deine Eingabe auch dynamisch kompilieren. Das heißt die Analyse übernimmt der Compiler, wodurch du selbst keinen Parser schreiben musst. (Ergibt das gleiche, als würdest du die Eingabe fest programmieren und das Programm kompilieren/starten.)

Public Function Parse(input As String) As Boolean
Dim provider As New VBCodeProvider
Dim parameters As New CodeDom.Compiler.CompilerParameters
parameters.GenerateInMemory = True
parameters.GenerateExecutable = True

' Programmcode erzeugen, der dynamisch kompiliert werden soll. Der übergebene Text wird dabei
' als Programmcode erkannt und entsprechend kompiliert.
Dim programCode As New System.Text.StringBuilder
programCode.AppendLine("Imports System.Windows.Forms")
programCode.AppendLine("Namespace RuntimeCompiled")
programCode.AppendLine(" Public Class RuntimeCompiledClass")
programCode.AppendLine(" Public Shared Sub Main()")
programCode.AppendLine(" End Sub")
programCode.AppendLine(" Public Shared Function Parse() As Boolean")
programCode.Append(" Return ")
programCode.AppendLine(input)
programCode.AppendLine(" End Function")
programCode.AppendLine(" End Class")
programCode.AppendLine("End Namespace")

' Programm kompilieren.
Dim compiledResult As CodeDom.Compiler.CompilerResults = provider.CompileAssemblyFromSource(parameters, programCode.ToString)
If compiledResult.Errors.HasErrors Then Throw New InvalidOperationException

' Methode mittels Reflection ermitteln, aufrufen und das Ergebnis zurückgeben.
Dim compiledAssembly As Reflection.Assembly = compiledResult.CompiledAssembly
Dim classType As Type = compiledAssembly.GetType("RuntimeCompiled.RuntimeCompiledClass")
Dim method As Reflection.MethodInfo = classType.GetMethod("Parse")
Return CBool(method.Invoke(Nothing, Nothing))
End Function

So würde die Methode aussehen. Der Aufruf wäre dann einfach:

Dim input As String = TextBox1.Text
input = input.Replace("1", "True")
input = input.Replace("0", "False")

Dim result As Boolean = Parse(input)
MessageBox.Show(result.ToString)

Der Vorteil ist, dass du damit komplizierte Anweisungen beliebig verschachteln kannst. Der Nachteil ist, dass damit jede Art von Code kompiliert wird. Es wäre daher möglich Schadcode auszuführen.

SomeNoOne 
Fragesteller
 17.05.2016, 22:23

Vielen Dank, das reicht für meine Zwecke erstmal völlig aus ;)

0