Сценарий:Попытка «просто» синтаксический ж/antlr4 переформатировать/довольно-печать
- Я получаю язык тайны с явно очень глубоким синтаксисом
- Огромную 10k беспорядок, на одной линии, представляет собой 1 заявление на языке мистерий
- Предположим, что я изначально не заботиться о глубоком синтаксисе
- Все, что я хочу сделать, это переформатировать его основе, на вложенной скобкой
Мои упрощенные языковые правила:
- Большая часть текста я не безразлична, я просто хочу, чтобы сохранить его как есть
- Открытие скобка означает, что открытый новый уровень; соответствие закрытия скобки означает сделать с этим уровнем
- может иметь несколько скобки на такой же уровень, разделенных запятыми, хотя я не очень забочусь о том, что
- может иметь несколько соседнего отверстие и закрывающую скобку
- Там может или не может текст перед первым парнем, а после последнего пара
Я пробовал кучу разных грамматик, начиная с примера ArrayInit в справочнике Antlr 4.
Это одна неудачная попытка:
grammar NestedParens ;
init: STR* ('(' value (value)* ')')* STR* ;
value: init
| STR
;
STR: [^()]+ ;
ANTLR ошибка дает:
«ошибка (153): NestedParens.g4: 5: 0: править INIT содержит замыкание, по крайней мере, одна альтернатива, которая может соответствовать пустой строке»
(номер строки может быть выключен из того, что я отправил)
Несколько мыслей:
- Я думаю, что действительные строки нулевой длины являются проблемой, но не уверен, как фактор вокруг них
- Может Antlr, который я считаю, всегда сверху вниз, ISN Это правильный инструмент для этого?
- Возможно, есть более простой инструмент, который позволяет указать только, что вы заботитесь о совпадении парс, фигурных скобок, скобок и т. Д.?
Как неудачу ваша попытка? Можете ли вы предоставить пример ввода с соответствующим выходом? Скобки всегда обозначают начало/конец уровня, без скобок внутри комментариев или строковых литералов? Если нет строковых литералов и комментариев, то я бы не стал разбираться с генератором синтаксического анализатора, а просто написал несколько строк кода, которые отслеживают уровень и при необходимости испускают некоторые отступы. –
@BartKiers, что пример грамматики не принимается и говорит: «Ошибка (153): NestedParens.g4: 5: 0: правило init содержит закрытие с хотя бы одной альтернативой, которая может соответствовать пустой строке» (номер строки может быть отключен от что я разместил) Так как он не принимает его, нет никаких попыток попробовать. Ответьте на другой вопрос в отдельном комментарии. –
@BartKiers да, открытый родитель всегда указывает на новый уровень, и закрытый палец всегда закрывает его. –