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