ТЛ; др
Для этого есть инструмент!
Нет необходимости писать код Java. Просто используйте ANTLR с грамматикой, приведенной ниже.
Да, ваш ввод (0(1)1(2(0)0)2)0
проходит как сбалансированный.
ANTLR 4
ANTLR - инструмент распознавания языка.
- Этап 1
Вы передаете ANTLR файл «грамматики», определяющий язык программирования (Java, C, COBOL и т. Д.) Или структуру данных (XML, JSON, CSV и т. Д.), и ANTLR генерирует исходный код Java для лексера и анализатора.
- Фаза 2
Вы компилируете эти источники. Затем запустите эти классы, предоставив исходный код или файл данных для анализа.
- Lexing
Поток символов обрабатывается для идентификации слов, ранее известных как tokens .
- Синтаксический анализ
Поток токенов обрабатывается для идентификации предложений (операторов на языке программирования или строк в файле данных). В результате получается Абстрактное синтаксическое дерево .
Используйте класс TestRig
в комплекте с ANTLR 4 для ввода значения с помощью консоли или файла. Если ваша входная строка чисел и паренов не сбалансирована должным образом, синтаксический анализ lexing будет сигнализировать об ошибке.
Я новичок в ANTLR, но эту грамматику я адаптировал из примера в Справочник по ANTLR 4 от Terence Parr (создатель проекта ANTLR ), похоже, делает эту работу за вас.
grammar ParenBalance;
prog: stat+ ;
stat: expr NEWLINE
| NEWLINE
;
expr: expr expr
| INT
| '(' expr ')'
;
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t]+ ;
Попробуйте некоторые входные данные (все с Newline , не показан):
42
проходит
(42)
проходит
(42
терпит неудачу, отсутствует ')'
42)
не удалось, посторонний ввод ')'
(((1)2)3)
проходит
((1 2)3)
Сбой, несоответствующий вход '', посторонний вход ')'
Давайте попробуем ваш ввод.
(0(1)1(2(0)0)2)0
проходит.
Вот скриншот ANTLR 4 в действии через плагин ANTLR4 для IntelliJ IDE. Нажмите, чтобы увеличить. ANTLR фактически управляется либо консолью, либо кодом Java. Плагин, показанный здесь, обрабатывает это взаимодействие от нашего имени, поэтому мы можем удобно работать в IDE.