Я сам не использовал firebase, но похоже, что приведенный ниже код настраивает слушателя для «квестовых» изменений, которые будут выполняться каждый раз, когда происходит изменение, но вы определили const quests = []
вне обработчика изменений db. Это означает, что при втором изменении вы поместите все снимки в тот же массив quests
, в который, возможно, уже были добавлены предыдущие снимки. Я полагаю, что вы можете это исправить, переместив переменную quests
внутри функции слушателя, как показано ниже.
componentDidMount() {
const database = firebase.database();
database.ref('quest').on('value', (snapshot) => {
const quests = [];
snapshot.forEach((childSnapshot) => {
quests.push({
id: childSnapshot.key,
quest: childSnapshot.val().quest,
points: childSnapshot.val().points,
});
});
console.log(quests);
this.setState(() => {
return {
quests: quests
}
});
console.log(this.state.quests);
});
}
Этот предмет время от времени подходит в списке рассылки ANTLR. Ответ обычно не, потому что форматы двоичного файла являются очень регулярными, и это просто не стоит издержек.
Вы можете взглянуть на Ragel . Это компилятор / лексер конечного автомата, который полезен для реализации протокольных протоколов. Я прочитал отчеты, что он генерирует очень быстрый код. Если вам не нужен анализатор и движок шаблонов, у ragel меньше издержек, чем у ANTLR. Если вам нужен полноценный синтаксический анализатор, AST и хорошая поддержка шаблонного движка, ANTLR может быть лучшим выбором.
Мне кажется, что наличие грамматики дает Вам огромный участок.
ANTLR 3.1 имеет StringTemplate и функции генерации кода, которые являются отдельными от parsing/lexing, таким образом, можно анализировать проблему тот путь.
Походит на победителя мне, стоящий попытки.