Комментарии 6
Интересно. А пробовали 0.1 + 0.2? Что у вас получилось?
То есть, встретив
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 ЯП сомнительная.
Считаем «a=1; b=2; x=pi/3; abcos(x)»