Вы можете использовать генератор парсеров, чтобы создать AST-дерево , а потом произвести последовательный обход его с вычислением выражения.
Вот пример такого генератора на JS.
Вот пример калькулятора.
А вот
тут рабочий порт генератора на PHP cо сложным примером.