簡體   English   中英

define 語句僅在 Lark 語法中緊跟賦值時才有效

[英]define statement only works if followed by an assignment in Lark grammar

我正在用 Lark 創建一個解析器。 對於我運行的大多數測試,解析器工作正常,但因 define 關鍵字而失敗。 只有在它后面有一個賦值時它才有效。 define a = 10工作正常,但define b不被視為 define 語句。

這是 Lark 解析器:

import lark

# ...

parser = lark.Lark("""
    ?start: statements
    ?statements: ((expr (";" | NEWLINE) | NEWLINE ) )* expr?
    ?expr: identifier | number | functioncall | define | assignment | function
    ?functioncall: identifier "(" arguments? ")"
    ?arguments: expr ("," expr)*
    ?define: "define" identifier ("=" expr)?
    ?assignment: identifier "=" expr

    ?function: "function" "(" parameters? ")" "->" identifier block
    ?parameters: identifier ("," identifier)*
    ?block: "{" statements "}"

    ?identifier: NAME -> identifier
    ?number: NUMBER -> number

    %import common.NEWLINE
    %import common.CNAME -> NAME
    %import common.NUMBER
    %import common.WS_INLINE
    %ignore WS_INLINE
    COMMENT: "/*" /(.|\n)+/x "*/" | "//" /.+/ NEWLINE?
    %ignore COMMENT
""")

我的測試:

tree = parser.parse("define a = 10")
assert(tree.data == "define") # OK
tree = parser.parse("define b")
assert(tree.data == "define") # NOT OK - tree.data is "identifier"

具體來說, parser.parse("define b")parser.parse("b")給出完全相同的結果。 我希望parser.parse("define b")給出一個以define規則開頭的樹,但我有一個identifier

有時 Lark 解析器沒有明確識別規則,例如, define bb給出Tree(identifier, [Token(NAME, 'b')]) 為了能夠區分兩者,您需要強制 Lark 為規則添加名稱,這可以通過在解析器定義的一行末尾添加-> name_of_rule來完成。 因此,例如, ?define規則的定義應該變成:

 ?define: "define" identifier ( "=" expr )? -> define

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM