Форум сайта python.su
Первое что написал спросонья:
class BrokenEgg(Exception):
pass
class Brain_breacker:
def __init__(self):
self.test_exp = ""
self.expect_operator = 0
self.braces = 0
self.operators = ("!", "&", "|", "==", "_")
self.operator_leters = ("!", "&", "|", "=", "_")
self.prefix_operators = ("!")
self.var_begining = ("x", "y")
def is_var(self, i):
if self.test_exp[i] in ("x", "y"):
return True
def add_var(self, i):
return i+1
def check_operator_expection(self, i):
if self.expect_operator:
raise BrokenEgg("Expect operator after '%s'." % self.test_exp[:i])
def check_other_expection(self, i):
if not self.expect_operator:
if self.test_exp[i] in self.prefix_operators:
return True
raise BrokenEgg("Don't expect operator after '%s'." % self.test_exp[:i])
def is_operator(self, i):
if self.test_exp[i] in self.operator_leters:
return True
def add_operator(self, i):
j = i
buf = ""
while self.test_exp[j] in self.operator_leters:
buf += self.test_exp[j]
j += 1
if buf in self.prefix_operators:
return j
if buf in self.operators:
return j
else:
raise BrokenEgg("Operator '%s' doesn't exist." % buf)
def start(self, expression):
self.test_exp = expression
i = 0
while i < len(self.test_exp):
#print i, " - ", self.test_exp[i], " - ", self.test_exp
if self.test_exp[i] == "(":
self.check_operator_expection(i)
self.braces += 1
self.expect_operator = False
i += 1
continue
if self.test_exp[i] == ")":
self.braces -= 1
self.expect_operator = True
i += 1
continue
if self.is_var(i):
self.check_operator_expection(i)
i = self.add_var(i)
self.expect_operator = True
continue
if self.is_operator(i):
self.check_other_expection(i)
self.expect_operator = False
i = self.add_operator(i)
continue
if self.test_exp[i] == " ":
i += 1
continue
raise BrokenEgg("Unexpectable simbol '%s'." % self.test_exp[i])
if self.braces:
raise BrokenEgg("Something wrong with braces.")
return True
def test(text, i = [0]):
i[0] += 1
print ">Test number %s:" % i[0]
print "Test expression is '%s'." % text
bb = Brain_breacker()
try:
bb.start(text)
print "It's allright with '%s'" % text
except BrokenEgg as e:
print e
print ""
test("(!x == y & x ! x & !(!x & !y))")
test("(!x + y & x ! x & !(!x & !y))")
test("(!x == y & x = x & !(!x & !y))")
test("(!x == (y) & (x ! x & !(!x & !y)))")
test("(!x == (y & (x ! x & !(!x & !y)))")
Офлайн
По какому поводу прострация? Не понравилось?
На всякий случай - парность скобок моя регулярка не проверяет. Но это я намеренно оставил студенту в качестве домашнего задания. Там на пару строк длиннее получится, либо можно попробовать расширить регулярку всякими look-ahead-ами.
Офлайн
Наоборот, понравилось. :)
Офлайн
Ну вот. мы тут пишем-пишем, а студент совсем потерял интерес. Пытается выяснить как посчитать скобки в параллельном треде :)
Офлайн
Пересмотрев свою задачу я понял, что только скобками всё не решить,интерес я ни в коем случае не потерял.
Тут ещё очень много условий, просто я создал другую тему http://python.su/forum/viewtopic.php?id=6949, в которой обсуждаются новые условия, и сейчас кажется понял что скобки тут практически вобще не нужны, только в начале по минимому.
Офлайн
Ркбят спасибо Огромное, только я не совсем смог разобрать логику кода,
можете сделать комментарии? и ЧТО такое yacc и PLY , может я смогу их использоват ьхотябы для элементарного пдщёта скобок?
Да и мне ещё очень понравилась идея с мат формулами, но я не знаю тех функцих которые вы указали, и не сильно понял хелп питона,
можете расказать как они действуюТ?
Офлайн
В моем решении используется только re. Документация здесь: http://docs.python.org/library/re.html
Вы хотя бы попробуйте запустить, потестить. Подумать над кодом тоже не помешает. А что такое yacc и PLY вам гугл скажет не хуже здесь присутствующих.
Офлайн
Мой код считает не только скобки. :)
Он даже скажет где в заданном выражении ошибка. И он достаточно гибкий чтобы задать нужные условия. Что не устраивает?
А регулярки это конечно жесть. Но боюсь что без бутылки тут не разобраться. ))
Отредактировано (Март 27, 2010 21:54:12)
Офлайн
Знаете мне очеь понравился ваш ход решения:
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"
In [1]: is_prop_formula("(A=B)>(&C<D)=C=T>Z")
Out[1]: True
In [2]: is_prop_formula("+(A=B)>(&C<D)=C=T>Z")
Out[2]: False
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"
Офлайн
Griffon, у вас инттересный ход, но я немного не могу проследить его
Во первых я ещё не толком не понимаю что такое class.
И немоглибы вы выыложить ваш код с коментариями
Отредактировано (Март 27, 2010 22:32:42)
Офлайн