Я пытаюсь разобрать строку на самодельном языке в своего рода дерево, например ::
# a * b1 b2 -> c * d1 d2 -> e # f1 f2 * g
должно привести к:
# a
* b1 b2
-> c
* d1 d2
-> e
# f1 f2
* g
#, * и -> являются символами. a, b1 и т. д. являются текстами.
С того момента, как я знаю только метод rpn для оценки выражений, и мое текущее решение заключается в следующем. Если я разрешу использовать только один текстовый токен после каждого символа, я могу легко преобразовать выражение сначала в нотацию RPN (b = b1 b2; d = d1 d2; f = f1 f2) и проанализировать его отсюда:
a b c -> * d e -> * # f g * #
Однако объединение текстовых токенов и всего остального представляется проблематичным. Моя идея заключалась в создании маркеров маркера (M), поэтому RPN выглядит так:
a M b2 b1 M c -> * M d2 d1 M e -> * # f2 f1 M g * #
, который также разбирается и, кажется, решает проблему.
Это говорит:
- Кто-нибудь имеет опыт с чем-то подобным и может сказать, что это так или это не жизнеспособное решение для будущего?
- Есть ли лучшие методы для анализа выражений с неопределенной арностью операторов?
- Можете ли вы указать мне на некоторые хорошие ресурсы?
Примечание. Да, я знаю, что этот пример очень напоминает нотацию префикса Lisp, и, возможно, нужно было бы добавить несколько скобок, но у меня нет никакого опыта здесь. Однако исходный текст не должен содержать никаких искусственных скобок, а также я не уверен, что делать с потенциальными инфиксными миксинами, такими как # a * b -> [if value1 = value2] c -> d.
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ: Кажется, что я ищу источники в постфиксной записи с переменным числом аргументов.