2014-11-17 2 views
0

Сценарий:Попытка «просто» синтаксический ж/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 Это правильный инструмент для этого?
  • Возможно, есть более простой инструмент, который позволяет указать только, что вы заботитесь о совпадении парс, фигурных скобок, скобок и т. Д.?
+0

Как неудачу ваша попытка? Можете ли вы предоставить пример ввода с соответствующим выходом? Скобки всегда обозначают начало/конец уровня, без скобок внутри комментариев или строковых литералов? Если нет строковых литералов и комментариев, то я бы не стал разбираться с генератором синтаксического анализатора, а просто написал несколько строк кода, которые отслеживают уровень и при необходимости испускают некоторые отступы. –

+0

@BartKiers, что пример грамматики не принимается и говорит: «Ошибка (153): NestedParens.g4: 5: 0: правило init содержит закрытие с хотя бы одной альтернативой, которая может соответствовать пустой строке» (номер строки может быть отключен от что я разместил) Так как он не принимает его, нет никаких попыток попробовать. Ответьте на другой вопрос в отдельном комментарии. –

+0

@BartKiers да, открытый родитель всегда указывает на новый уровень, и закрытый палец всегда закрывает его. –

ответ

0

Попробуйте эту грамматику:

grammar NestedParens ; 
init: STR* ('(' value (value)* ')') STR* ; 
value: init 
    | STR 
    ; 
STR: [^()]+ ; 

Разница является один отсутствующий * который сделал пустую строку, соответствующую init в вашей версии (ошибка, что ANTLR компилятор жаловался) больше не совпадают.

Это также будет работать:

grammar NestedParens ; 
init: STR* ('(' value (value)* ')')+ STR* ; 
value: init 
    | STR 
    ; 
STR: [^()]+ ; 
+0

Выкл. По продажам, но попробуем скоро, спасибо! –