我試圖分析和評估表達式,從文件給我作爲輸入,形式爲:Python的pyparsing:實現語法解析邏輯與表達
var[3] = 0 and var[2] = 1
var[0] = 1 and var[2] = 0 and var[3] = 1
...
(其實我也讓「多位訪問「(即var[X:Y]
),但讓我們忽略它現在...)
其中var是一個整數,[]
指示位訪問。
例如,對於var = 0x9
,上面的第一個表達式應該評估爲False
,第二個表達式應該從0x9 = b1001
開始評估爲True
。
and
和=
是我允許的唯一二元運算符,對於=
運算符,左操作數始終爲var[X]
,右操作數始終爲數字。
我試着環顧了一下,發現這可能與使用Python的pyparsing
可以實現,但我遇到了一些困難,努力實現它。
這是我到目前爲止已經試過,在this example大致基於(這是提供here許多例子之一):
#!/usr/bin/env python
from pyparsing import Word, alphas, nums, infixNotation, opAssoc
class BoolAnd():
def __init__(self, pattern):
self.args = pattern[0][0::2]
def __bool__(self):
return all(bool(a) for a in self.args)
__nonzero__ = __bool__
class BoolEqual():
def __init__(self, pattern):
self.bit_offset = int(pattern[0][1])
self.value = int(pattern[0][-1])
def __bool__(self):
return True if (0xf >> self.bit_offset) & 0x1 == self.value else False # for now, let's assume var == 0xf
__nonzero__ = __bool__
variable_name = 'var'
bit_access = variable_name + '[' + Word(nums) + ']'
multibit_access = variable_name + '[' + Word(nums) + ':' + Word(nums) + ']'
value = Word(nums)
operand = bit_access | multibit_access | value
expression = infixNotation(operand,
[
('=', 2, opAssoc.LEFT, BoolEqual),
('AND', 2, opAssoc.LEFT, BoolAnd),
])
p = expression.parseString('var[3] = 1 AND var[1] = 0', True)
print 'SUCCESS' if bool(p) else 'FAIL'
我有三個問題,我需要幫助。
- 對於形式
var[X:Y] = Z
的多位訪問,我該如何強制執行:
一個。X > Y
b。Z < 2^{X - Y + 1}
我認爲這不能由語法本身來實施(例如,對於形式var[X] = Y
的單位的訪問,我可以由語法強制執行Y
將或者0
或1
,並且這將導致expression.parseString()
如果Y != 0/1
)失敗。 - 更重要的是:爲什麼總是打印
SUCCESS
?我究竟做錯了什麼?
對於輸入var[3] = 1 AND var[1] = 0
應該是打印FAIL
(你可以在我的例子,我硬編碼var
是0xf
看,所以var[3] = 1
是True
但var[1] = 0
是False
)。 - 這將我帶到我的第三個問題:
var
是不是BoolEqual
的類成員也不是全球...有沒有辦法以某種方式將它發送到BoolEqual
的__init__
函數?
對#2的簡單回答:p是一個非空的ParseResults,因此無論內容如何,它都將始終評估爲True。試試'print('SUCCESS'if bool(p [0])else'FAIL')' – PaulMcG