一個簡明的編譯器
多次看到有人提起文本表達式的計算問題,就動手整理以前的代碼並加上注釋。
寫一個簡單的編譯器並不是很復雜的,當中要用到些反射的知識。自已覺得,反射的使用在NET中真是無處不在,使用反射沒什麼效率不效率的問題,畢竟現在的電腦配置並不是很低。適當使用反射,或者通過使用反射本身,會使自己加深對NET的理解。以後會寫些運用反射增加代碼靈活性的小”文章”供初學者參考。
如果只是計算表達式的值的,當然用不了那麼多的代碼.這樣寫法,只是使它通用性強些.
以下的我直接貼代碼了,不再說些什麼(可以說如何如何臭,只是不許罵人)。
Imports System.Reflection
Imports System.CodeDom
Imports System.CodeDom.Compiler
Public Class SourceComp
'//編譯器接口
Private m_Compiler As ICodeCompiler
'//編譯器參數
Private m_CompilerParameters As CompilerParameters
'//引用的程序集
Private m_RefAssemblies As String() = {"System.dll", "System.Data.dll"}
'//源代碼
Private m_Source As String = ""
'//記錄是否是默認的源代碼
Private m_Is_Default As Boolean = True
'//記錄編譯狀態
Private m_Compiled As Boolean = False
'//編譯生成的程序集
Private m_Assembly As System.Reflection.Assembly
'//默認源代碼生成的實例
Private m_tmpClass As Object
'//默認源代碼生成的實例函數
Private m_MethodInfo As System.Reflection.MethodInfo
'//默認源代碼函數的表達式參數
Private m_Expression As String
'//返回程序集
Public ReadOnly Property cpAssembly() As System.Reflection.Assembly
Get
Return Me.m_Assembly
End Get
End Property
Sub New()
'//獲取VB編譯器實例
Me.m_Compiler = New VBCodeProvider().CreateCompiler
'//初始編譯器參數
Me.m_CompilerParameters = New CompilerParameters
With Me.m_CompilerParameters
.GenerateExecutable = False '//False值指定編譯為類集,True編譯為可執行程序