[英]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 b
和b
給出Tree(identifier, [Token(NAME, 'b')])
。 為了能夠區分兩者,您需要強制 Lark 為規則添加名稱,這可以通過在解析器定義的一行末尾添加-> name_of_rule
來完成。 因此,例如, ?define
規則的定義應該變成:
?define: "define" identifier ( "=" expr )? -> define
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.