Я не вижу здесь Дейкстры, поскольку она используется для поиска кратчайшего пути в графе с неотрицательными весами.
В вашем случае вы говорите о парсере рекурсивного спуска, который имеет вид LL (k) и определяется грамматикой, аналогичной
expression ::= term + term | term - term
term ::= factor * factor | factor / factor
factor ::= ident | number
number ::= digit | digit number
digit ::= 0 | 1 | 2 ...
Лучшей структурой данных для хранения такого рода информации обычно является Абстрактное синтаксическое дерево , которое представляет собой дерево, которое воспроизводит структуру кода, который он анализирует. В вашем примере вам понадобится другая структура или класс для различных частей кода: BinaryOperation
, Ident
, Number
, UnaryOperation
, FunctionCall
, в итоге получится что-то вроде
BinaryOperation +
| |
BinaryOperation *
| |
Number BinaryOperation +
| |
0.756 BinOp *
| |
Ident Ident
| |
C D
РЕДАКТИРОВАТЬ: Не знал, что маневр был изобретен Dijkstra! Кстати, это довольно простой алгоритм, как объяснил Морон. Вы никогда не перестанете узнавать что-то новое!