2012-06-13 2 views
4

Моя компания пытается написать некоторое программное обеспечение для Android. Мы хотели бы работать с Java, и есть компонент программного обеспечения компании, который является C++, и поэтому его нужно портировать (или, по крайней мере, нужно перенести требования перед тем, как попробовать материал NDK). Этот код был создан с использованием Accent, и он определяет грамматическую грамматику. Насколько я могу судить, оригинальный автор (теперь ушел) написал грамматику, чтобы указать, как указать грамматику, а затем скомпилировал компилятор-компилятор с этой грамматикой и Accent. Компилятор-компилятор принимает грамматику указанного формата и создает двоичный код для анализа строк, соответствующих этой грамматике. Вот пример фрагмент грамматики:компилятор компилятора грамматики для Java

//include rules from from this file (such as <alpha>) 
include "alphabet.bnf" 

<<topSymbol>> = <alpha> <alpha> <alpha>? .//two letters with an optional third 
//square brackets enclose an XML statement clarifying semantics of the rule 
[ 
    <topSymbol> 
     <letter> 
         <command val="doSomethingToLetter"/> 
     </letter> 
     <!--etc.--> 
    </topSymbol> 
] 

Мой вопрос заключается в том, как сделать это с помощью Java, используя Antlr или какой-либо другой инструмент. Компилятор-компилятор компилятора мне кажется довольно сложным. В качестве альтернативы, я хотел бы знать, как легко компилировать/разбирать этот тип грамматики, который содержит грамматическую и семантическую XML-информацию.

+1

Если вам нужен компилятор-компилятор-компилятор, то вы делаете что-то неправильно. –

+4

Грамматика. Компилятор-компилятор-компилятор. ИТ-рэп? – maksimov

+8

Yo dawg, я слышал, вам понравилось описывать языки, поэтому я сделал грамматику для вашей грамматики для вашей грамматики, чтобы вы могли разобрать, как вы разбираете, как вы разбираете. –

ответ

1

Мой вопрос в том, как это сделать с Java, используя Antlr или какой-либо другой инструмент. Компилятор-компилятор компилятора мне кажется довольно сложным.

Это тоже звучит сложно!

В качестве альтернативы, я хотел бы знать, как легко скомпилировать/разбор этого типа грамматики, которая содержит грамматическую и семантическую XML-информацию.

Нет ... на это нет простого ответа. Похоже, что ваш бывший коллега перешел на верхнюю часть сложности. Вы будете иметь к:

  • либо получить вокруг головы, что делает его код, и как он это делает, узнать, как работает Antlr, и рука переводить,
  • или угробить свой код и дизайн, и найти более простой способ делать то, что он делает.

Удачи вам!


(На самом деле, есть хороший шанс, что код не так сложно, как кажется ... как только вы получите ваши головы вокруг него, и технологии компилятором компилятор.)

+0

Я согласен с этим ответом, если вы успешно реализуете то, что вы просили, а затем подумайте о следующем разработчике, когда вы ушли и попытаетесь попасть туда. –

+0

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

1

Ваш лучший выбор заключается в том, чтобы перевести грамматику в ANTLR или Java CC или какой-либо другой инструмент.

Другая возможность - называть код C++ с помощью JNI, но это чревато опасностью.

Я не знаю ничего, что могло бы помочь. Вам просто нужно взять лопату и начать копать.

+2

(я бы рекомендовал вилку для спагетти вместо лопаты :-) –

3

Если оригинальный дизайнер знал, что он делает, и это оправданно, то вы хотите сохранить эту концепцию. Правильный подход - с другим генератором парсеров (или, по крайней мере, с синтаксической схемой). Любой JavaCC или ANTLR будет хорош в качестве генераторов парсера; вам придется вручную перевести грамматику. Вы можете hand code a recursive descent parser, если грамматика достаточно проста.

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

Смежные вопросы