使用Lark解析来获取符号

时间:2017-09-01 23:04:15

标签: python parsing

我正在尝试解析我正在编写的一些伪代码,并且在获取符号值方面遇到了一些麻烦。它成功解析,但它不会返回与“常规”字符相同的值。这是一个例子:

>>> 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'

为什么没有价值?是否有其他方法可以获得使用的确切运算符?

2 个答案:

答案 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
'>'