2017-09-01 80 views
1

我想解析一下我寫的一些僞代碼,並且在獲取符號值時遇到了一些麻煩。它解析成功,但不會返回與「常規」字符相同的值。這裏是一個例子:Lark解析得到符號

>>> from lark import Lark 
>>> parser = Lark('operator: "<" | ">" | "=" | ">=" | "<=" | "!="', start="operator") 
>>> parsed = parser.parse(">") 
>>> parsed 
Tree(operator, []) 
>>> parsed.data 
'operator' 
>>> parsed.value 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'Tree' object has no attribute 'value' 

爲什麼不會有值?是否有另一種方法來獲得使用的確切運算符?

回答

1

看來,在默認情況下它會刪除「令牌」(或它認爲「標點符號」標記幸運的是,要改變這種行爲稱爲keep_all_tokens的選項

下面是與該選項的例子:。

。雲雀
>>> from lark import Lark 
>>> parser = Lark('operator: "<" | ">" | "=" | ">=" | "<=" | "!="', start="operator", keep_all_tokens=True) 
>>> parsed = parser.parse(">") 
>>> parsed 
Tree(operator, [Token(__MORETHAN, '>')]) 
>>> parsed.children[0].value 
'>' 
0

筆者在這裏小李的答案是正確的,但更好的方法來獲得相同的結果是通過對規則的前綴:

>>> from lark import Lark 
>>> parser = Lark('!operator: "<" | ">" | "=" | ">=" | "<=" | "!="', start="operator") 
>>> parser.parse(">") 
Tree(operator, [Token(__MORETHAN, '>')]) 
「!」