zExpression 句法編譯器+解釋器,腳本引擎內核
技術體系解釋:
- 在編譯原理的技術體系中,凡是處理文本化的代碼前,都需要做一次預處理,其中我們常說的語法,語法糖,都是一種預處理程序
- 詞法:詞法是對文本關鍵字,數字,符號,進行分類整理,最後形成詞法樹,並且嚴格遵循順序化處理原則
- 申明:在預處理代碼中,申明部分,叫做申明樹,申明樹又依賴於詞法順序預處理,因為對詞法預處理是一種簡化手段
- 句法:在經過了申明預處理以後,是對代碼表達式的單行邏輯操作進行處理,這一步叫句法,取為zExpression句法編譯器是我從曾經撰寫的編譯器中特意剝離出來的解決方案,它可以獨立出來分發和使用,可以實用數字化預處理,圖形圖像,科學計算等等領域,也可以作為學習提高自己的手段
核心思路
- 實現zExpression採用的是對等複雜化原則,面向解決編譯器問題而編寫,複雜度相比於常規程序會高許多,因為解決了最終問題,代碼在命名和堆結構上也看不出漏洞,所以它是成熟句法解釋器方案
zExpression特點
- 完整的單步原子化操作
- 完整的符號優先級後處理
- 能預處理字面錯誤,並反饋錯誤發生在哪
- 能識別浮點和整數的自然數寫法
- 支持函數調用
- 支持自定義腳本語法
- 逆波蘭2.0符號優先級處理
- 支持安卓和蘋果各型號手機
- 完整的功能Demo,完整性能和解析準確性評估框架
- 在編譯以後,能形成原子化op代碼,可以通過stream高速載入並運行,不限制cpu類型
- OP代碼框架可以輕鬆譯碼成ARMv7 ARMx64 x64 x86等平台的機器碼
- 矩陣和向量表達式支持
平台支持,test with Delphi 10.3 update 2 and FPC 3.0.4
- Windows: delphi-CrossSocket(C/S OK), delphi-DIOCP(C/S OK), delphi-ICS(C/S OK), delphi-Indy(C/S OK),delphi+fpc Synapse(C/S OK)
- Android:Indy(C/S OK), CrossSocket(Only Client)
- IOS Device: Indy(C/S OK), CrossSocket(Only Client)
- IOS Simulaor: n/a
- OSX: Indy(C/S OK),ICS(未測試), CrossSocket(C/S OK)
- Ubuntu16.04 x64 server: Indy(C/S OK), CrossSocket(C/S OK)
- Ubuntu18.04 x86+x64 Desktop:only fpc3.0.4 Synapse(C/S OK)
- Ubuntu18.04 x86+x64 Server:only fpc3.0.4 Synapse(C/S OK)
- Ubuntu18.04 arm32+arm neon Server:only fpc3.0.4 Synapse(C/S OK)
- Ubuntu18.04 arm32+arm neon desktop:only fpc3.0.4 compile ok,no test on run.
- Ubuntu16.04 Mate arm32 desktop:only fpc3.0.4 compile ok, test passed
- Raspberry Pi 3 Debian linux armv7 desktop,only fpc 3.0.4,test passed.
- wince(arm eabi hard flaot),windows 10 IOT,only fpc 3.3.1,test passed.
CPU架構支持,test with Delphi 10.3 update 2 and FPC 3.0.4
- MIPS(fpc-little endian), soft float, test pass on QEMU
- intel X86(fpc-x86), soft float
- intel X86(delphi+fpc), hard float,80386,PENTIUM,PENTIUM2,PENTIUM3,PENTIUM4,PENTIUMM,COREI,COREAVX,COREAVX2
- intel X64(fpc-x86_64), soft float
- intel X64(delphi+fpc), hard float,ATHLON64,COREI,COREAVX,COREAVX2
- ARM(fpc-arm32-eabi,soft float):ARMV3,ARMV4,ARMV4T,ARMV5,ARMV5T,ARMV5TE,ARMV5TEJ
- ARM(fpc-arm32-eabi,hard float):ARMV6,ARMV6K,ARMV6T2,ARMV6Z,ARMV6M,ARMV7,ARMV7A,ARMV7R,ARMV7M,ARMV7EM
- ARM(fpc-arm64-eabi,hard float):ARMV8,aarch64
更新日誌
2021-9-22
- 在NumberBase庫內置了zExpression驅動,詳見zCloud的網絡變量服務https://github.com/PassByYou888/zCloud
- 修復OpCache沒有初始化的問題
- 優化OpRunTime
- 支持delphi 11
- 支持fpc for IOT設備
2021-7
- 修復字符表達式-2.0E-3這類識別問題
- 修復OpCode.pas庫因為大小寫敏感不兼容win/linux問題
2020-3
- 對註冊函數新增申明信息
- 修復函數前符號-func(1+1)
- 修復函數後符號func(1+1)-1
2019-7
矩陣表達式支持
// 构建3*3的variant矩阵,使用c语法表达式
procedure MatrixExp ;
var
m: TExpressionValueMatrix;
begin
DoStatus( ' ' );
m := EvaluateExpressionMatrix( 3 , 3 ,
' "hello"+"-baby"/*备注:字符串联合*/,true,false, ' +
' 1+1,2+2,3+3, ' +
' 4*4,4*5,4*6 ' , tsC);
DoStatus(m);
end ;
// 构建variant向量数组,使用pascal语法表达式
procedure MatrixVec ;
var
v: TExpressionValueVector;
begin
DoStatus( ' ' );
v := EvaluateExpressionVector( ' 0.1*(0.1+max(0.15,0.11)){备注内容},1,2,3,4,5,6,7,8,9 ' , tsPascal);
DoStatus(v);
end ; 2019-4
- 修復TextParsing備註編碼後的bug
- OpCode新增回調調用類型(參考zAI工具鏈中的Script支持)
2018-9-29
- 新技術:新增文本探頭技術:可將螞蟻程序的編程複雜度降低50%
- 新技術:逐字符文本字符爬取性能提升%500
- 多平台:全面支持多種IOT系統以及多處理器硬件架構
- 新Demo:新增一個FPC的Demo,該Demo不使用匿名函數
- 工藝:兼容基於FPC對IOT的支持:從底層到高級,大規模統一調整命名,此項調整會影響很多工程的代碼細節
// 本项目中的回调分为3种
// call: 直接指针回调,fpc+delphi有效
// method: 方法回调,会继承一个方法宿主的地址,fpc+delphi有效
// proc: 匿名过程回调,只有delphi有效
// 如果本项调整对于改造现有工程有一定的工作量,请使用字符串批量处理工具
// 在任何有回调重载的地方,方法与函数,均需要在后缀曾加回调类型首字母说明
// 如
RunOp 变更为 RunOpP() // 后缀加P表示匿名类型回调
RunOp 变更为 RunOpM() // 后缀加M表示方法类型的回调
RunOp 变更为 RunOpC() // 后缀加C表示指针类型的回调
2018-7-6
- 大幅修正底層庫的命名規則
- 對fpc/86/64平台支持,全部基礎庫支持Linux下的無故障編譯和運行
- 對fpc編譯器3.1.1全面支持
- 新增大小字節序支持
- 修復對32位fpc編譯器不認for用Int64的問題
- 修復字符串在fpc編譯器運行於linux發生異常的問題
- 新增pascal預編譯工具,將pascal代碼規范成c風格的全部統一大小寫,全面兼容Linux區分大小寫文件名的機制
2018-4-12
- 修復內核中的內存越界bug:該bug的症狀為無故提示內存無法訪問,通過正常debug很難排除,這是是內存越界時所造成的bug
2018-3-1
- 在TPascalString內核中新增模糊字符串對比函數(SmithWaterman),優化與測試完成
- 該算法屬於生物基因工程學科Smith-Waterman的維基百科地址https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm
2018-2-28
- 修復c轉義字符buf,感謝阿木qq345148965
- 將charPos的參數命名更改成了cOffset,並且加入const修飾符
2018-2-26
- 修復使用Release模式無法編譯問題
- 修復zExpression的切割分段不正確問題
- 小幅提升字符探頭的切割性能(splitToken,splitChar)
- 因為底層重寫了一個原子鎖,在很多record申明前加入了packed修飾符
2018-2-25
- 新增自定義表達式符號支持
- 新增自定義表達式符號的演示
2018-2-25
- 修復嵌套函數參數不能正確展開接口的問題
- 修復解析引擎的數字探頭不能識別16進制自然數和函數問題
- 新增一個賦值的demo範例,包含變量申明,靜態復用,動態復用,總共三部曲,請在範例演示中自行研究
- 修復字符串和數字匹配聯合的問題
- 支持c代碼風格0x16進制語法
2018-2-6
- 重寫了一次解析器內核,支持函數調用,從現在起,zExpression會不斷更新
使用zExpression有疑問請加互助qq群490269542,請不要直接聯繫作者
by.qq600585 2017-6