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

просто для указания простого решения, которое сработало для меня

, преобразовать его в строку, а затем повторно использовать его ...

var number = 123.45678;
var number_s = '' + number;
var number_truncated_s = number_s.match(/\d*\.\d{4}/)[0]
var number_truncated = parseFloat(number_truncated_s)

Его можно сокращать до

var number_truncated = parseFloat(('' + 123.4568908).match(/\d*\.\d{4}/)[0])
1
задан Carlos Cavero 7 March 2019 в 22:14
поделиться

1 ответ

Я не слишком тщательно изучил ваш код, но вот мое впечатление:

Ваш анализатор проверяет, что первая группа символов, которую он видит, образует правильную формулу, а затем останавливается. Если после этого появляется мусор, это не имеет значения, ваш парсер все еще счастлив, потому что нашел правильную формулу.

Я вижу два способа справиться с этим в вашей грамматике:

  • Требовать, чтобы формула заканчивалась каким-то метасимволом «конец потока»

  • [ 118] Добавить новое правило, соответствующее последовательности формул. Например,

<document> ::= <formula> |
               <formula> <document>

(Конечно, это левая рекурсия, но вы сможете решить ее без особых проблем.)

Также:

} else if (proposition(sym)) {
    nextSym();
}

Мне кажется подозрительным, что эта ветка ничего не возвращает.

0
ответ дан JETM 7 March 2019 в 22:14
поделиться
Другие вопросы по тегам:

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