Оценка математического выражения

class BaseReturnType { }
class DerivedReturnType : BaseReturnType { }

abstract class BaseClass {
    public abstract BaseReturnType PolymorphicMethod();
}

class DerivedClass : BaseClass {
    // Error: return type must be 'BaseReturnType' to match 
    // overridden member 'BaseClass.PolymorphicMethod()'
    public override BaseReturnType PolymorphicMethod() { 
        return new DerivedReturnType(); 
    }
}

это должно работать

10
задан smci 31 July 2018 в 01:38
поделиться

4 ответа

Если вы «академически заинтересованы», вы хотите узнать, как написать синтаксический анализатор с приоритетом оператора.

Простой анализ сверху вниз в Python - хорошая статья который создает пример синтаксического анализатора, который делает именно то, что вы хотите: оценивать математические выражения.

Я настоятельно рекомендую попробовать написать свой собственный первый синтаксический анализатор - это один из тех "ах, , который " как это работает "моменты!

16
ответ дан 3 December 2019 в 18:34
поделиться

Это то, что делает функция eval в Python.

result = eval(expression)

Остерегайтесь, хотя она может делать гораздо больше, в первую очередь вызывать функции, поэтому для безопасности вы должны убедиться, что она не может доступ к местным или глобальным. Кроме того, вы можете получить доступ к встроенным методам, включая хитрый import , поэтому вам также необходимо заблокировать доступ к нему:

result = eval(expression, {'__builtins__': None}, {})

Но это только в том случае, если вам нужна безопасность, то есть если вы разрешаете кому-либо вводить любое выражение.

Конечно, поскольку вы таким образом блокируете использование всех переменных locla, у вас нет никаких переменных для использования, поэтому для этого вам нужно передать только те переменные, которые должны быть доступны в словарях.

vars = {'__builtins__': None, 'x': x}
result = eval(expression, vars, {})

или аналогичный.

2
ответ дан 3 December 2019 в 18:34
поделиться

Я не очень хорошо знаком с Python и какими-либо чрезвычайно питоническими методами, но вы можете посмотреть на паттерн интерпретатора , который описан в книге «Банда четырех». Он разработан для обработки «языка», а математические выражения подчиняются правилам определенного языка. Фактически, пример в Википедии на самом деле является Java-реализацией калькулятора RPN.

1
ответ дан 3 December 2019 в 18:34
поделиться

Другая возможность - посмотреть на Pyparsing , который представляет собой общий конструктор парсеров. Он более мощный, чем вам нужно, но его можно реализовать быстрее.

2
ответ дан 3 December 2019 в 18:34
поделиться