Pyslvs v0.9 大更新進度
- lark 基本用法
參考連結:
lark 基本用法
利用 lark 創造表示式語法。
定義文法的結構是使用擴展巴科斯範式 (Extended Backus–Naur Form, EBNF),巴科斯範式 (BNF) 即為 Qt 的輸入遮罩 (Mask) 所用的語法。
lark 有提供基本的類型判斷,例如 NUMBER、WORD 等等,用 %import
語法匯入即可。
接著,使用冒號 :
定義類似 class 的角色,使用 pip 符號 |
可以同時聯集允許項目。這些類型只要名稱不衝突即可。
若想讓該項目可以函式化,使用箭號 ->
給定新名稱。
以下是一個簡單表示 PMKS 機構的文法:
from lark import Lark parser = Lark( ''' type : "R" | "P" | "PR" name : WORD num : NUMBER -> number | "-" num -> neg joint : "J[" [type "," point "," link ("," num)?] "]" link : "L[" [name ("," name)*] "]" point : "P[" [num "," num] "]" mechanism: "M[" [joint ("," joint)*] "]" %import common.NUMBER %import common.WORD %import common.WS %ignore WS ''', start='mechanism' ) expr = "M[J[R,P[0.0,0.0],L[ground,i]]]" print(parser.parse(expr)) print(parser.parse(expr).pretty())
上面 %import common.WS
是匯入空白字元,%ignore WS
代表解析上會忽略空白字元,斷句部分想加多少空白都可以。
一個需要小心的地方是 %import common.ESCAPED_STRING
代表 "AAA"
;%import common.WORD
代表 AAA
,使用上要注意。
另外 lark 無法解析時會 raise 錯誤,無論是文法還是輸入值,要注意不要導致程式出錯。
使用 pretty 方法可印出:
mechanism joint type point number 0.0 number 0.0 link name ground name i
最後可以透過 InlineTransformer 類型來執行解析後函式化的指令。
Comments
comments powered by Disqus