मैं पार्स और भाव का मूल्यांकन करने के लिए फ़ाइल से इनपुट के रूप में मुझे दिया कोशिश कर रहा हूँ,, फार्म की: (वास्तव में मैं भी "multibit उपयोग की अनुमतिपायथन के 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]
होता है और दायां ऑपरेंड हमेशा एक संख्या होती है।
मैंने थोड़ा सा देखने की कोशिश की और पाया कि यह पाइथन के 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'
मैं तीन समस्याओं मैं के साथ मदद की जरूरत है।
-
रूप
- , मैं यह कैसे लागू करते हैं:
एक।X > Y
बी।Z < 2^{X - Y + 1}
मुझे लगता है इस व्याकरण ही द्वारा लागू नहीं की जा सकती है (उदाहरण के लिए, प्रपत्रvar[X] = Y
की एकल बिट पहुँच के लिए, मैं व्याकरण से लागू कर सकते हैं किY
हो जाएगा या तो0
या1
, और इसexpression.parseString()
कारण होगाY != 0/1
पर अपवाद के साथ असफल होने के लिए)। - सबसे महत्वपूर्ण बात यह है कि यह हमेशा
SUCCESS
क्यों प्रिंट करता है? मैं क्या गलत कर रहा हूं?
इनपुटvar[3] = 1 AND var[1] = 0
के लिए यह (, तुम मेरे उदाहरण है कि मैंvar
hardcoded0xf
होने के लिए देख सकते हैंvar[3] = 1
True
है, लेकिनvar[1] = 0
False
है) होना चाहिए मुद्रित किया जाFAIL
। - कौन मुझे मेरी तीसरी समस्या के लिए लाता है:
var
BoolEqual
के एक वर्ग के सदस्य नहीं है और न ही यह वैश्विक है ... वहाँ एक रास्ता किसी भी तरहBoolEqual
के__init__
समारोह को भेजने के लिए है?
var[X:Y] = Z
की multibit पहुँच के लिए
# 2 का आसान उत्तर: पी एक खाली खाली पारस्परिक है, इसलिए सामग्री के बावजूद यह हमेशा सत्य का मूल्यांकन करेगा। 'प्रिंट' (सफलता 'अगर बूल (पी [0]) और' FAIL ')' – PaulMcG