Создание эффективного внешнего DSLs

Я столкнулся с той же проблемой, и я решил это следующим образом:

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

    String currentEmail = MyApp.getSharedPreferences().getEmail();
    String currentPass = MyApp.getSharedPreferences().getPass();

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.createUserWithEmailAndPassword(email, pass)
            .addOnCompleteListener(AddStudent.this, new OnCompleteListener<AuthResult>() {

                @Override
                public void onComplete(@NonNull final Task<AuthResult> task) {

                    if (task.isSuccessful()) {
                        String currentEmail = MyApp.getSharedPreferences().getEmail();
                        String currentPass = MyApp.getSharedPreferences().getPass();

                        //Sign in again
                        auth.signInWithEmailAndPassword(currentEmail, currentPass)
                                .addOnCompleteListener(AddStudent.this, new OnCompleteListener<AuthResult>() {
                                    @Override
                                    public void onComplete(@NonNull Task<AuthResult> task) {
                                        if (!task.isSuccessful()) {
                                            Log.e("RELOGIN", "FAILED");
                                        } else {
                                            Log.e("RELOGIN", "SUCCESS");
                                        }
                                    }
                                });

                        finish();
                    }
                }
    });
11
задан vitaut 18 April 2012 в 14:21
поделиться

4 ответа

Я записал DSLs в Шиканье, Irony.NET и инструментарии под названием Grammatica. Вы говорите, что парсер-генератор является слишком сложным, но можно быть слишком поспешными в суждении, на самом деле они вполне просты в использовании, после того как Вы преобладаете над небольшой кривой обучения и открываете обширный мир возможности, которая легко переопределяет усилие. Я нашел изучение нотации требуемым записать грамматики для большинства парсеров-генераторов, несколько подобных изучению Регулярных выражений - необходимо изогнуть ум просто немного для впущения их, но вознаграждения являются значительными.

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

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

Я соглашаюсь в долгосрочной перспективе о внутреннем по сравнению с внешним DSL's, все же. Я записал внутренний DSL в Шиканье и должен был изменить мой синтаксис DSL, чтобы заставить его работать, и всегда было похоже на взлом. Ту же грамматику с помощью Irony.NET или ANTLR было бы столь же легко выполнить с большей гибкостью.

У меня есть сообщение в блоге, обсуждая некоторые опции. Сообщение центрируется вокруг записи DSL для вычисления выражения во время выполнения, но инструменты являются всеми одинаковыми.

Мой опыт с Irony.NET был все положителен, и существует реализованное использование нескольких ссылочных языков его, который является хорошим местом для запуска. Если Ваш язык прост, он не является абсолютно сложным для подъема и выполнение. Существует также библиотека по CodeProject по имени TinyParser - этот действительно интересен, потому что она генерирует синтаксический анализатор как чистый исходный код, что означает, что Ваш конечный продукт абсолютно свободен от любой сторонней ссылки. Я не использовал его сам, все же.

9
ответ дан 3 December 2019 в 04:15
поделиться

Необходимо действительно проверить Ragel. Это - платформа для встраивания конечных автоматов в регулярный исходный код. Ragel поддерживает C, C++, Objective C, D, Java и Ruby.

Великое Ragel для записи файла и синтаксических анализаторов протокола, а также продвижения через внешний материал DSL. В основном, потому что это позволяет Вам выполнять любой вид кода изменений состояния и такого.

Несколько известных проектов, которые используют Ragel, Полукровка, большой рубиновый веб-сервер. И Hpricot, основанный на рубине синтаксический анализатор HTML, вид вдохновленных jQuery.

Другая замечательная особенность Ragel - то, как это может генерировать находящиеся в graphviz диаграммы, которые визуализируют Ваши конечные автоматы. Ниже пример, взятый от Zed Shaw статья о ragel диаграммах состояний.

ragel state chart

4
ответ дан 3 December 2019 в 04:15
поделиться

Если Вы изучаете запись автономного DSLs, то Вы изучаете создание компиляторов - никакой путь вокруг этого. Конструкция компилятора является существенным знанием программирования, и это действительно не столь трудно, как обычно думается. Еда Программиста Steve Yegge Righ суммирует значение знания, как создать компиляторы вполне приятно.

Существует много способов начать. Я рекомендую проверить эти 2 бумаги, упомянутые в статье: Хотите записать компилятор? Просто прочитайте эти Две газеты. Первый, Давайте создадим компилятор, очень доступно. Это использует Turbo Pascal в качестве языка реализации, но можно легко реализовать его на любом другом языке - исходный код очень ясен. Паскаль является простым языком.

После того как Вы получаете хорошее ощущение того, как вещи работают и включенная терминология, я рекомендую копаться в чем-то как ANTLR. ANTLR имеет хороший IDE, ANTLRWorks, который идет с интерпретатором и отладчиком. Это также производит действительно действительно хорошую визуализацию Ваших грамматик на лету. Я нашел это неоценимым в изучении.

ANTLR имеет несколько хороших учебных руководств, хотя они могли бы быть немного подавляющими сначала. Этот хорош, хотя это против ANTLR 2.0, таким образом, Вы могли бы столкнуться с несовместимостями с более поздней версией (в настоящее время, последнее 3.1).

Наконец, существует другой подход к DSLs: подход Lisp. Учитывая характер синтаксиса меньше Lisp (Ваш код является в основном абстрактными синтаксическими деревьями), можно сформировать бесконечные языки из него, если Вы привыкаете к круглым скобкам :).

Если Вы действительно идете с тем подходом, Вы хотите использовать встраиваемый Lisp. Под Java у Вас есть Clojure, диалект Lisp, который взаимодействует безупречно с JVM и ее библиотеками. Я не использовал его лично, но это выглядит хорошим. Для Схемы существует Хитрость GNU, которая лицензируется под LGPL. Для языка Common LISP существует ECL, также под LGPL. Оба используют интерфейс C для совместимости, таким образом, можно в значительной степени встроить их в любой другой язык. ECL уникален среди, Шепелявит в той каждой функции Lisp, реализован как функция C, таким образом, можно написать код Lisp в C, если Вы хотите к (скажите в Ваших собственных методах расширений - можно создать функции C, которые воздействуют на объекты Lisp и затем называют их от Lisp). Я использовал ECL для моего параллельного проекта некоторое время, и мне нравится он. Специалист по обслуживанию является довольно активным и быстро реагирующим.

8
ответ дан 3 December 2019 в 04:15
поделиться

Я использую Иронию с хорошими результатами. Самое замечательное в иронии заключается в том, что вы можете легко включить ее в любую среду выполнения, для которой вы будете использовать DSL. Я создаю внешний DSL, который заполняю в семантическую модель, написанную на C #, так что ирония - это здорово. Затем я использую семантическую модель для генерации кода с помощью StringTemplate.

1
ответ дан 3 December 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: