Рекомендуемая стратегия для синтаксического анализа специального синтаксиса if / else в Java? - PullRequest
2 голосов
/ 22 июля 2011

(Извините, не уверен, правильное ли здесь слово ad-hoc ... откройте для лучшего предложения)

Я пытаюсь разобрать Galaxy ToolConfigФормат оболочки инструмента XML CLI в приложении Java для репликации (частично) поведения самого программного обеспечения Galaxy.

Формат включает в себя некоторые «произвольные текстовые» предложения if / else, внутри командытег (это единственное место, где они встречаются, AFAIK):

...
<command interpreter="python">
  sam_to_bam.py
    --input1=$source.input1
    --dbkey=${input1.metadata.dbkey} 
    #if $source.index_source == "history":
      --ref_file=$source.ref_file
    #else
      --ref_file="None"
    #end if
    --output1=$output1
    --index_dir=${GALAXY_DATA_INDEX_DIR}
</command>
...

Какова была бы рекомендуемая стратегия для разбора этой структуры if / else на что-то, что можно использовать для преобразования логики if / else в Java?

Является ли BNF / ANTLR излишним, лучше просто разобраться в некоторой структуре объекта или?Какие-нибудь шаблоны дизайна, которые бы здесь подходили?(Раньше не работал с BNF / ANTLR, но готов разобраться, стоит ли это того).

1 Ответ

2 голосов
/ 22 июля 2011

Если вы хотите захватить всю структуру вашего ввода, синтаксический анализатор - единственный путь.Можно рекурсивно кодировать синтаксический анализатор вручную, но в этом нет особого смысла, поэтому существуют инструменты генератора синтаксических анализаторов;используйте их.

Что касается #if #then #else: если вы хотите захватить структуру only , то вам нужна только довольно примитивная грамматика, которая также позволяет токенам, содержащим произвольный текст,подберите goo между символами # if # then # else как каплей текста.

Если вы хотите захватить всю структуру кода, а условные выражения разрешены только в определенных местах, то их существование может быть простоинтегрированы в любой используемый вами BNF.

Если, как я подозреваю, это может произойти в любом месте ("ad hoc"? #if следует стилю препроцессора C, и эти условия могут возникать виртуальногде-нибудь во входном потоке), тогда синтаксический анализ текста и , сохраняющий условные выражения, в настоящее время находится на переднем крае того, что может сделать современный анализ.Это стандартная болезнь C-препроцессинга, и хороших решений для этого не было.Стандартные генераторы парсеров довольно не могут помочь в этом случае.(Парсеры с ручным кодированием здесь тоже не лучше; в любом случае нужно использовать одно и то же решение).

Одна из последних схем (только что сообщенная как результаты исследований PhD за последние несколько месяцев)чтобы справиться с этим, нужно разборчиво разбирать всякий раз, когда найден токен #if для обработки #if и #else, и присоединяться, когда найден #endif;тогда вам нужен способ слияния с сгенерированными поддеревьями, как правило, в виде неоднозначных поддеревьев, помеченных каким плечом условного.

Если вы хотите продолжить свою жизнь, я предлагаю вам просто настаивать на том, чтобы эти условные обозначения возникали в-определенные места в вашей грамматике, и терпеть случайные жалобы от людей, которые пишут неструктурированные директивы препроцессора.(«Вы написали сумасшедший код? Извините, мой инструмент не справляется с этим»).

...