我应该如何在 LARK 中定义一个同时支持 NOT 和 AND NOT 的 NOT 运算符
How should I define a NOT operator which supports both NOT and AND NOT in LARK
这是我当前代码的样子,它只支持 a AND NOT b
。有没有办法让它也 return 成为 a NOT b
的同一棵树?任何建议将不胜感激。
from lark import Lark
grammar = r'''
start: or_test
?or_test: and_test ("OR" and_test)*
?and_test: not_test ("AND" not_test)*
?not_test: "NOT" not_test -> not
| atom
atom: WORD -> term
| "(" or_test ")"
WORD: /[a-zA-Z0-9]+/
%import common.WS_INLINE
%ignore WS_INLINE
'''
parser = Lark(grammar)
s = 'NOT a AND b AND NOT c'
tree = parser.parse(s)
print(tree.pretty())
输出
start
and_test
not
term a
term b
not
term c
我认为这应该可以满足您的要求:
from lark import Lark
grammar = r'''
start: or_test
?or_test: and_test ("OR" and_test)*
?and_test: not_test ("AND" not_test | and_not)*
and_not: "NOT" not_test -> not
?not_test: "NOT" not_test -> not
| atom
atom: WORD -> term
| "(" or_test ")"
WORD: /[a-zA-Z0-9]+/
%import common.WS_INLINE
%ignore WS_INLINE
'''
parser = Lark(grammar)
s = 'NOT a AND b AND NOT c NOT d'
tree = parser.parse(s)
print(tree.pretty())
这是我当前代码的样子,它只支持 a AND NOT b
。有没有办法让它也 return 成为 a NOT b
的同一棵树?任何建议将不胜感激。
from lark import Lark
grammar = r'''
start: or_test
?or_test: and_test ("OR" and_test)*
?and_test: not_test ("AND" not_test)*
?not_test: "NOT" not_test -> not
| atom
atom: WORD -> term
| "(" or_test ")"
WORD: /[a-zA-Z0-9]+/
%import common.WS_INLINE
%ignore WS_INLINE
'''
parser = Lark(grammar)
s = 'NOT a AND b AND NOT c'
tree = parser.parse(s)
print(tree.pretty())
输出
start
and_test
not
term a
term b
not
term c
我认为这应该可以满足您的要求:
from lark import Lark
grammar = r'''
start: or_test
?or_test: and_test ("OR" and_test)*
?and_test: not_test ("AND" not_test | and_not)*
and_not: "NOT" not_test -> not
?not_test: "NOT" not_test -> not
| atom
atom: WORD -> term
| "(" or_test ")"
WORD: /[a-zA-Z0-9]+/
%import common.WS_INLINE
%ignore WS_INLINE
'''
parser = Lark(grammar)
s = 'NOT a AND b AND NOT c NOT d'
tree = parser.parse(s)
print(tree.pretty())