Conversation
|
На данный момент работает логика создания констант(но не массивов, для них вроде игнорируется) Данный код выведет В этом случае: const будет расценена как преременная и выведется много единиц Такая ситуация тоже расценивается как ошибка |
source/runner.d
Outdated
| } | ||
| state.back.arrays[cur.dest.name] = | ||
| Array (new long [values[0].to !(size_t)]); | ||
| Array (new long [values[0].to !(size_t)], cur.isConst); |
There was a problem hiding this comment.
Зачем это? У нас же нет инициализации массива. То есть константный массив может состоять только из нулей. Лучше уж запретить его, пока это так.
There was a problem hiding this comment.
Ну да, я думал о том, что это немного бесполезно, но всё же запрещать-то зачем? Но хорошо, сейчас добавлю запрет
There was a problem hiding this comment.
Запрещать полезно, когда от этого в среднем меньше багов.
source/parser.d
Outdated
| while (!t.empty && (t.front.isDigit || t.front == '_')); | ||
| } | ||
| else if (t.front.isIdent) | ||
| else if (t.front.isIdent || t == "const") |
There was a problem hiding this comment.
Ключевое слово лучше проверить до проверки на идентификатор.
| { | ||
| foreach_reverse(ref curState; state) | ||
| { | ||
| if(dest.name in curState.vars) |
There was a problem hiding this comment.
Хмм, то есть мы можем сделать переменную константой в середине работы программы? Это странно, и выглядит скорее как баг, чем как фича...
В принципе я видел такую идиому в Rust. Но здесь, считаю, гораздо вероятнее, что программист ошибся и хотел создать новую константу во внутреннем контексте, чем что он хотел сделать константой существующую переменную.
|
В последнем коммите я сделал 2 основных изменения: Также приводят к ошибке |
source/parser.d
Outdated
| } | ||
| while (!t.empty && (t.front.isDigit || t.front == '_')); | ||
| } | ||
| else if (t.front.isIdent || t == "const") |
There was a problem hiding this comment.
Так, я понял бОльшую проблему. Что вообще const делает в tokenize? Тут же не разбираются отдельно for и if. Видимо, считается, что они просто isIdent.
Пока нет отдельной сущности "ключевые слова" -- токенайзер трогать не надо =)
There was a problem hiding this comment.
Я думал, этот if уже в парсе, а не в tokenize. Не посмотрел на контекст, прошу прощения.
|
Вообще, мне нравится, как пока что это коротко выглядит. |
syntax.txt
Outdated
| <const-decl> | ||
|
|
||
| <const-decl> is | ||
| const <name> = <expression0> |
There was a problem hiding this comment.
ну как минимум это точно неправда =) в языке всё ещё нет оператора =
| <const-decl> is | ||
| const <name> = <expression0> | ||
|
|
||
| <assignment> is |
There was a problem hiding this comment.
Мы же обсуждали изменение вида
<assignment> is
<variable> <assign-op> <expression0>
+const <variable> <assign-op> <expression0>
Соответственно, тогда понятно, что в parser.d меняется одна функция: parseAssignStatement.
Сейчас в коде так и есть, а в грамматике какой-то дебош вместо этого =)
There was a problem hiding this comment.
Честно говоря, я не особо понимаю как работать с подобной грамматикой
syntax.txt
Outdated
| <constant> | ||
| <call> | ||
| ( <expression0> ) | ||
| <name> |
There was a problem hiding this comment.
неправда, мы <name> разбираем внутри <variable>
|
Прямо сейчас const в ЯП работает так: Если парсер увидит const, то он уверен, что после него переменная, поэтому всё что дальше подчиняется правилу создания переменных с точностью до имени(имя любое). Поэтому, например, код: Выведет много раз 1 и ошибку не выведет |
Да, ключевые слова никак не защищены. Но это отдельная проблема, которую нужно будет отдельно решать. В этом PR-е давай этим не заниматься. |
|
Пока что меня смущает, как вообще всё работает и до, и после изменений: Только строка 2 падает в compile time. Сообщение об ошибке оставляет желать лучшего. Строки 3 и 4 падают лишь в run time. Действительно ли мы в compile time не можем понять, что они точно упадут? Кажется, что в программе нет путей, когда в контекст попала одна и та же переменная, но разной константности. Строки 5 и 6 вообще не падают. Я могу перезаписать константный массив новым массивом, который уже не будет константным. Наверное, это даже неплохо для обычных массивов как способ их быстро занулить, просто выглядит странным. Но это всё проблемы, которые были и до изменений. |
|
test 1: Наверное, надо |
|
test 2: Работает. |
|
test 3: Работает, во внутреннем контексте тоже не создаёт. |
|
test 4: Работает без проблем: присваивание не переносит константность на |
|
test 5: Писать |
Про это. Я делал логику именно с ключевым словом const. В данном случае при запуске программы входные параметры задаются константными. Это было и до моих добавлений. Это я не менял. const ar := array(1) То будет честная ошибка |
|
test 6: Программа отрабатывает, а зря. |
|
test 7: Работает, тут |
|
test 8: Работает: |
|
test 9: Работает (ну только слова надо поправить, но это уже обсуждается выше). |
|
В общем, пока только тест 6 не работает. |
No description provided.