Я столкнулся с той же проблемой, и я решил это следующим образом:
Когда пользователь вводит логин, я сохраняю адрес электронной почты и пароль в общих настройках. И после создания пользователя я снова вхожу в систему с помощью электронной почты и пароля, которые я сохранил ранее.
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();
}
}
});
Я записал DSLs в Шиканье, Irony.NET и инструментарии под названием Grammatica. Вы говорите, что парсер-генератор является слишком сложным, но можно быть слишком поспешными в суждении, на самом деле они вполне просты в использовании, после того как Вы преобладаете над небольшой кривой обучения и открываете обширный мир возможности, которая легко переопределяет усилие. Я нашел изучение нотации требуемым записать грамматики для большинства парсеров-генераторов, несколько подобных изучению Регулярных выражений - необходимо изогнуть ум просто немного для впущения их, но вознаграждения являются значительными.
Мое мнение - это: Если Ваш выходной язык достаточно прост, что он мог быть обработан dumbed вниз визуальный разработчик, то запись грамматики для него с помощью парсера-генератора должна быть довольно легкой.
Если Ваш целевой DSL будет сложным достаточно, что необходимо будет вспотеть, пишущий грамматику, то dumbed вниз визуальный инструмент не сократит горчицу так или иначе, и Вы закончите тем, что имели необходимость учиться писать грамматику так или иначе.
Я соглашаюсь в долгосрочной перспективе о внутреннем по сравнению с внешним DSL's, все же. Я записал внутренний DSL в Шиканье и должен был изменить мой синтаксис DSL, чтобы заставить его работать, и всегда было похоже на взлом. Ту же грамматику с помощью Irony.NET или ANTLR было бы столь же легко выполнить с большей гибкостью.
У меня есть сообщение в блоге, обсуждая некоторые опции. Сообщение центрируется вокруг записи DSL для вычисления выражения во время выполнения, но инструменты являются всеми одинаковыми.
Мой опыт с Irony.NET был все положителен, и существует реализованное использование нескольких ссылочных языков его, который является хорошим местом для запуска. Если Ваш язык прост, он не является абсолютно сложным для подъема и выполнение. Существует также библиотека по CodeProject по имени TinyParser - этот действительно интересен, потому что она генерирует синтаксический анализатор как чистый исходный код, что означает, что Ваш конечный продукт абсолютно свободен от любой сторонней ссылки. Я не использовал его сам, все же.
Необходимо действительно проверить Ragel. Это - платформа для встраивания конечных автоматов в регулярный исходный код. Ragel поддерживает C, C++, Objective C, D, Java и Ruby.
Великое Ragel для записи файла и синтаксических анализаторов протокола, а также продвижения через внешний материал DSL. В основном, потому что это позволяет Вам выполнять любой вид кода изменений состояния и такого.
Несколько известных проектов, которые используют Ragel, Полукровка, большой рубиновый веб-сервер. И Hpricot, основанный на рубине синтаксический анализатор HTML, вид вдохновленных jQuery.
Другая замечательная особенность Ragel - то, как это может генерировать находящиеся в graphviz диаграммы, которые визуализируют Ваши конечные автоматы. Ниже пример, взятый от Zed Shaw статья о ragel диаграммах состояний.
Если Вы изучаете запись автономного 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 для моего параллельного проекта некоторое время, и мне нравится он. Специалист по обслуживанию является довольно активным и быстро реагирующим.
Я использую Иронию с хорошими результатами. Самое замечательное в иронии заключается в том, что вы можете легко включить ее в любую среду выполнения, для которой вы будете использовать DSL. Я создаю внешний DSL, который заполняю в семантическую модель, написанную на C #, так что ирония - это здорово. Затем я использую семантическую модель для генерации кода с помощью StringTemplate.