我正在尝试解析我正在编写的一些伪代码,并且在获取符号值方面遇到了一些麻烦。它成功解析,但它不会返回与“常规”字符相同的值。这是一个例子:
>>> 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'
为什么没有价值?是否有其他方法可以获得使用的确切运算符?
答案 0 :(得分:4)
Lark的作者。 Mike的答案是准确的,但是获得相同结果的更好方法是使用“!”规则上的前缀:
>>> from lark import Lark
>>> parser = Lark('!operator: "<" | ">" | "=" | ">=" | "<=" | "!="', start="operator")
>>> parser.parse(">")
Tree(operator, [Token(__MORETHAN, '>')])
答案 1 :(得分:2)
默认情况下,它会删除&#34;令牌&#34;(或它所考虑的&#39;标点符号&#39;标记。幸运的是,可以选择更改名为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
'>'