просто для указания простого решения, которое сработало для меня
, преобразовать его в строку, а затем повторно использовать его ...
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])
Я не слишком тщательно изучил ваш код, но вот мое впечатление:
Ваш анализатор проверяет, что первая группа символов, которую он видит, образует правильную формулу, а затем останавливается. Если после этого появляется мусор, это не имеет значения, ваш парсер все еще счастлив, потому что нашел правильную формулу.
Я вижу два способа справиться с этим в вашей грамматике:
Требовать, чтобы формула заканчивалась каким-то метасимволом «конец потока»
<document> ::= <formula> |
<formula> <document>
(Конечно, это левая рекурсия, но вы сможете решить ее без особых проблем.)
Также:
} else if (proposition(sym)) {
nextSym();
}
Мне кажется подозрительным, что эта ветка ничего не возвращает.