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