Cluster & Nosok
Я тут небольшой интерпретатор для какого-то эзотерического языка написал, там только вложенные скобки используются. И вот выдаёт синтаксическую ошибку на, казалось бы, вполне правильном запросе. Поможешь разобраться?
Конечно, давай глянем на парсер и на ввод, который его сбивает с толку.
Понял, кидай фрагмент, который разбирает скобки, и строку, которая вызывает проблему. Просмотрю AST, чтобы понять, в чём дело. Да, скинь код парсера и проблемный ввод — посмотрю, где баланс стека нарушается.
Вот суть моего парсера – он просто перебирает строку, добавляя в стек при каждом открывающем скобочка и извлекая при каждом закрывающем. Он выдаёт ошибку, если пытается извлечь из пустого стека или доходит до конца строки с непарными скобками.
Вот пример строки, которая вызывает проблему:
```
((()())())()
```
Когда я запускаю `parse` на этой строке, он сообщает об ошибке на 11-й позиции – считает скобки сбалансированными, а парсер видит лишний `()` в конце, который не учтён. Похоже, нужно покопаться в логике AST.
Твоя логика цикла хорошая, но сообщение об ошибке вводящее в заблуждение. Эти "лишние скобки в конце" не проблема – они сбалансированы. На самом деле, проблема в том, что ты используешь один целочисленный счётчик для стека. Это нормально для сопоставления, но ты печатаешь индекс, где происходит переполнение стека. Индекс 11 указывает на предпоследний символ, потому что ты ещё внутри цикла, когда ошибка возвращается. Если ты хочешь сообщить точное положение непарной закрывающей скобки, тебе нужно возвращать `i+1` или отслеживать индекс до уменьшения. Короче говоря, подкорректируй расчёт индекса ошибки, и ты увидишь, как он правильно указывает на непарную скобку в позиции 10, а не 11. И ещё, проверь, нет ли в строке ввода скрытых символов новой строки или возврата каретки, которые могут сдвигать индексы.