Как стать автором
Обновить

Комментарии 6

Попробовал. В версии с decimal.js получилось 0.3

Тут на самом деле с настройками точности decimal.js можно поиграться. На точное вычисление 0.1 + 0.2 их хватает в любом случае. А pi надо было инициализировать не из Math.PI, а из Decimal.acos(-1), но там всё равно единицы не будет.

То есть, встретив IDENTIFIER, мы сверяемся с именами в таблице символов, и если находим совпадение, то переопределяем match на совпавшую часть, которая короче изначально встреченного идентификатора. Благодаря этому в следующей итерации while мы продолжим разбор где-то внутри того идентификатора, что и даст нам необходимое поведение.

Разваливается на "ab=3; a=1; ab+a". Собственно, о чем я и говорил в комментах к прошлой статье. Без нормального анализа неоднозначностей нет смысла выкатывать такую термоядерную фичу. Для каждого вновь создаваемого идентификатора надо проверить возможность собрать его из уже имеющихся (если можно, валить ошибку), а при взятии значения - возможность собрать более чем одним способом. Для этих задач, вероятно, может пригодиться Бор , на тот случай если идентификаторы длинные и надо ускорить поиск.

Вообще, с созданием новых идентификаторов всё даже чуть сложнее: надо так же проверять, что новый может оказаться недостающим звеном в конструировании старых. Например, уже имея переменные "a" и "ab", нельзя добавить "b" - с ним "ab" становится неоднозначным. И т.д. Хитрая задача, да.

console.log(new ExpressionCalc('ab=3; a=1; b=2; x=pi/3; abcos(x)').calc()); //1.0
console.log(new ExpressionCalc('a=1; b=2; x=pi/3; ab=3; abcos(x)').calc()); //1.5

Склеивать вместе идентификаторы чтобы потом их пытаться разобрать не самая замечательная идея, хотя бы пробелы вместо умножения (как в вольфрамовской математике).

https://github.com/rswier/c4/blob/master/c4.c

не совсем js конечно, но зато с компиляцией в байткод стэковой виртуальной машины и даже возможностью самосборки.

немного допилить, чтобы wasm байткод на выходе генерил, потом самособрать и засунуть в браузер.

не совсем js конечно, но зато с компиляцией в байткод стэковой виртуальной машины и даже возможностью самосборки.

Мне кажется, что это немного другой жанр. Там буквально написано "exercise in minimalism". У меня просто exercise.

Ну а склеивание идентификаторов не моя идея. Я лишь решил поупражняться в её реализации. Согласен, что идея для plain text ЯП сомнительная.

Мне кажется, что это немного другой жанр

да по коду точно такой же парсер (из книги Страуструпа), который 90% занимает, ВМ там в последних 50 строчках.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории