Плохой синтаксический анализ с интерполированными строками, разделенными точкой?

Я пошел напечатать номер версии вроде 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}')
Другие вопросы по тегам