Плохой синтаксический анализ с интерполированными строками, разделенными точкой?
Я пошел напечатать номер версии вроде v3.14 и получил следующее:
version.v:218:30: error: unexpected `$2`, expecting `name`
216 | ver1 := (x >> 24) & 0xFF
217 | ver2 := (x >> 16) & 0xFF
218 | println('Version v$ver1.$ver2')
| ^
Решением было поставить скобки ver1
в println
чтобы избежать плохого анализа. Я думаю, что понимаю, почему это происходит (точка заставляет синтаксический анализ думать, что у него составное имя), но я бы подумал, что знак доллара наver2
предотвратил бы это.
(да, не такой уж большой вопрос)
2 ответа
Точка заставляет синтаксический анализатор продолжить синтаксический анализ выражения. Затем парсер видит$
а также ver2
токены, и они не образуют допустимого выражения, поэтому вы получите ошибку. (Обратите внимание, например,$
может быть началом действительного выражения в V).
Вместо этого будет работать любой из них:
println('Version v${ver1}.$ver2')
println('Version v$ver1\.$ver2') // escape the dot
Вы должны это сделать. Чтоб не думатьver2
быть частью ver1
.
println('Version v${ver1}.${ver2}')