2016-02-26 3 views
2

Я пытаюсь оценить эту строку. «1 + 2^4 * 4 * (4 + 4 * 9) -10»Оценить строку "1 + 2^4 * 4 * (4 + 4 * 9) -10"

Моя стратегия - взять каждый элемент, поместить его в список, преобразовать в правильный тип данных (int) или оператор, объединить и затем оценивать. Я пытаюсь избежать использования eval(), и ast.literal_eval() выбрасывает «неверную ошибку строки». Я сейчас застрял в точке, где мне нужно преобразовать своих операторов из строк в операторы.

Вот что я сделал до сих пор:

equation = ("1+2^4*4*(4+4*9)-10") 

listint1 = 0 
listint2 = 1 
finallist = [] 
for elements in equation: 
    finallist.append(equation[listint1:listint2]) 
    listint1 = listint1 + 1 
    listint2 = listint2 + 1 

finalfinallist = [] 
for element in finallist: 
    if element.isdigit() == True: 
     finalfinallist.append(int(element)) 
    else: 
     finalfinallist.append(element) 

for element in finalfinallist: 
    if element == str: 
     if element == "+": 
      element = + 
     elif element == "^": 
      element =^
     elif element == "*": 
      element = * 
     elif element == "(" 
      element = (
     elif element == ")": 
      element =) 
     elif element == "-" 
      element = - 


print finalfinallist 

Мысли?

+0

Помогает ли это? https://gist.github.com/nava45/6333409#file-infix-expression-evaluation – nehemiah

ответ

2

То, что вы пытаетесь построить, является парсером. Вы можете посмотреть https://en.wikipedia.org/wiki/Comparison_of_parser_generators. Анализаторы используются для реализации контекстно-свободных грамматик, см. https://en.wikipedia.org/wiki/Context-free_grammar

Я предполагаю, что на 2^4 вы имеете в виду возведение в степень, а не бит-xor (как в случае операторов-питонов).

При попытке разобрать 2^4*4 может быть (2^4) * 4 = 16 * 4 = 64 или 2^(4*4) = 2^16 = 65536. Я не знаю ast, но попробуйте взглянуть на «правила ассоциативности».

0

Возможно, вы захотите начать с создания дерева выражений для такого рода вещей!

Wikipedia: Expression Trees

Это позволит сделать обработку операторов несколько проще, таким образом, вы будете знать, когда ожидать оператора, и может сделать сравнение строк, чтобы определить, какой оператор использовать на операндов в выражении дерева!

Имейте в виду, что мне никогда не приходилось делать это на Python, только на C. Так что если есть более питонический способ сделать это, я в настоящее время не знаю и хотел бы услышать это.

Смежные вопросы