Перейти к содержимому
Топаз6.0 · До релиза
Загрузка →

Поиск в документации

Спецификация 6.0

Выберите результат стрелками и нажмите Enter, чтобы открыть его.

Введите имя API, номер диагностики, правило или тему проекта.

    Язык · 1 глава · 17 правил

    Лексическая структура

    Source spellings, reserved and contextual words, comments, line breaks and diagnostic positions.

    Scope and ownership

    Ссылка

    Lexical structure identifies source spellings and statement boundaries. Literal values, escapes and template forms belong to Literals and templates. Name lookup and binding restrictions belong to Bindings and scope. Operator grouping belongs to Expressions and operators.

    Contextual forms retain the owners listed below.

    Identifiers, underscore and labels

    Ссылка
    EBNF
    1. IdentifierSpelling = IdentifierStart IdentifierContinue* ;
    2. IdentifierStart = ( "_" | UnicodeLetter | NonAsciiEmoji ) - DefaultIgnorable ;
    3. IdentifierContinue = ( IdentifierStart | UnicodeNumber | UnicodeMark ) - DefaultIgnorable ;
    4. Identifier = IdentifierSpelling - ReservedWord - "_" ;
    5. Underscore = "_" ;
    6. Label = "'" IdentifierSpelling ;

    In this EBNF excerpt, * denotes repetition and - excludes a scalar or spelling. UnicodeMark comprises Mn, Mc, and Me. DefaultIgnorable is Unicode 16.0.0 Default_Ignorable_Code_Point. The complete IdentifierSpelling must already be NFC. The NFC condition applies to the whole sequence, not to each scalar separately. ReservedWord is defined in the next section.

    Правилоtopaz.lexical-structure.rule.identifier-characters

    Identifier characters

    An identifier starts with _, a Unicode letter, or a non-ASCII scalar with the Unicode Emoji property. Later scalars may also be Unicode numbers and combining marks.

    The character classes use Unicode 16.0.0. Letters use Lu, Ll, Lt, Lm, Lo, numbers use Nd, Nl, No, and combining marks use Mn, Mc, Me. A combining mark cannot start a name.

    Exclude every scalar with Default_Ignorable_Code_Point from both positions, even when it is a letter or combining mark. This includes variation selectors, join controls, combining grapheme joiner, Hangul fillers, and emoji tag characters. No script or emoji sequence receives an exception. Each scalar in a multi-scalar emoji name must qualify independently. String data follows the string rules.

    Причина

    Programs can name values in the languages of the documents they process. Combining marks continue a name so those spellings do not depend on precomposed letters. A scalar that is normally invisible must not distinguish two names. Excluding Default_Ignorable_Code_Point from both positions gives names one rule without script, font, or emoji-presentation exceptions.

    Правилоtopaz.lexical-structure.rule.identifier-classification

    Complete identifier spellings

    When no string delimiter immediately follows, the lexer classifies the complete identifier spelling. A spelling in ReservedWord becomes a keyword token. The complete spelling _ becomes an underscore token. Other spellings become identifier tokens.

    Причина

    Classifying a complete word prevents a keyword prefix from splitting a longer name. A distinct wildcard token keeps discarded values separate from named bindings.

    Правилоtopaz.lexical-structure.rule.labels

    Label spellings

    ' followed by IdentifierSpelling forms a label token. Its body is not reclassified as a keyword.

    Причина

    The label prefix distinguishes a control target from a value name. Its separate token class makes the target visible before name lookup.

    See Pattern matching and Expressions and operators for uses of _. Blocks and control flow describes label binding and jump targets.

    Правилоtopaz.lexical-structure.rule.identifier-normalization

    Canonical source spelling

    The complete name must already be in Unicode 16.0.0 NFC form in the source. This applies to declarations, references, members, fields, label bodies, and template tag names. Check the whole sequence before keyword or tag classification.

    Bindings and lookup compare the admitted scalar sequence exactly. They do not normalize a spelling silently or create a second alias. NFC uses canonical equivalence. It does not apply compatibility normalization or case folding.

    A non-NFC name produces TPZ0007 during lex. Mark the complete name span, excluding a label's apostrophe and a tag's string delimiter, and suggest its NFC spelling. Review the replacement for collisions before changing the source.

    Причина

    Canonically equivalent name spellings denote the same written name to a reader. Requiring one NFC source spelling prevents hidden aliases during binding and lookup. An explicit rejection and suggested replacement let the programmer review any resulting collision before changing the source. String contents remain data because normalizing them would change bytes the program may need to preserve.

    Reserved words

    Ссылка
    EBNF
    1. ReservedWord =
    2. "let" | "mut" | "const" | "type" | "function" | "return" | "if"
    3. | "else" | "match" | "case" | "for" | "in" | "by" | "while"
    4. | "break" | "continue" | "defer" | "concurrent" | "true" | "false" | "null" ;

    The literal values of true, false and null are specified in Literals and templates.

    Правилоtopaz.lexical-structure.rule.identifier-names

    Identifier name positions

    A name position that requires an identifier rejects keyword tokens.

    Причина

    Keeping keywords out of binding positions prevents a declaration from replacing the meaning of a language form.

    Правилоtopaz.lexical-structure.rule.field-names

    Field name positions

    A field-name position accepts an identifier token or a keyword token.

    Причина

    A field position already identifies a data member. Accepting keyword spellings there preserves names from structured data without an escape syntax.

    Bindings and scope owns binding restrictions, including the treatment of None. Types and Functions and generics own compiler-defined type names and type-parameter restrictions.

    Contextual spellings and their owners

    Ссылка
    Правилоtopaz.lexical-structure.rule.contextual-spellings

    Contextual identifier spellings

    For identifier tokens with the spellings below, the parser assigns a contextual role when the surrounding form matches.

    SpellingRoleCanonical owner
    enum, record, newtypeNominal declaration headsRecords, enums and newtypes
    derivesDerivation clause after a nominal declaration headRecords, enums and newtypes; Protocols and implementations
    protocol, impl, usingProtocol, implementation and using formsProtocols and implementations
    import, exportProgram-level module formsModules and visibility
    asImport alias clauseModules and visibility
    useRecognized and rejected module-item spellingModules and visibility
    set, mapCollection forms before a braceCollections and comprehensions
    loopLoop head, optionally followed by a labelBlocks and control flow
    selfFirst-parameter recognitionFunctions and generics; receiver contexts in Protocols and implementations
    timeoutNamed timeout option in a concurrent formConcurrency

    Причина

    Recognizing these words at their construct heads lets them remain ordinary names elsewhere. The surrounding grammar supplies the role.

    The named chapters own these forms' grammar and meaning. Literals and templates owns tags and interpolation.

    Punctuation tokens

    Ссылка
    EBNF
    1. Punctuation =
    2. "..." | "..<" | "??=" | "**" | ".." | "?." | "??" | "<="
    3. | ">=" | ">>" | "==" | "!=" | "+=" | "-=" | "*=" | "/="
    4. | "%=" | "&&" | "||" | "=>" | "->" | "(" | ")"
    5. | "[" | "]" | "{" | "}" | "+" | "-" | "*" | "/"
    6. | "%" | "." | "?" | "<" | ">" | "=" | "!" | "~"
    7. | "|" | "," | ":" | ";" ;

    See Expressions and operators, Types, and Pattern matching for the syntactic roles of these tokens. The adjacent >> token supplies two type-closing delimiters and has no expression-operator meaning. The retired |> spelling is not a punctuation token or an expression form.

    Правилоtopaz.lexical-structure.rule.punctuation

    Punctuation token boundaries

    The punctuation scanner chooses the longest matching punctuation spelling. Comments, string delimiters, and label prefixes have separate lexical forms. The adjacent >> token supplies two type-closing delimiters. It has no expression-operator meaning.

    Причина

    Longest matching keeps a compound operator together. Its meaning does not depend on trying shorter operator spellings first.

    Whitespace and comments

    Ссылка
    EBNF
    1. HorizontalSpace = " " | HT ;
    2. Newline = LF | CR LF | CR ;
    3. LineComment = "//" NonNewlineScalar* ;

    NonNewlineScalar denotes a source scalar other than LF or CR. A comment starts with // and ends before LF, CRLF, CR, or the end of the source. Each physical break remains available to the normal layout rules.

    Правилоtopaz.lexical-structure.rule.whitespace

    Horizontal space and newlines

    Space (U+0020) and horizontal tab (U+0009) separate tokens. LF (U+000A), CRLF, and bare CR (U+000D) each supply one line break to layout processing. Each spelling preserves the same statement boundary. Indentation does not delimit blocks. Braces and the surrounding syntax determine block and list boundaries.

    Причина

    Equivalent line endings preserve a program when a file moves between editors or operating systems. Braces keep scope independent of indentation.

    Правилоtopaz.lexical-structure.rule.line-comments

    Line comments

    A line comment begins with // and ends before the next LF, CRLF, or bare CR, or at the end of the source. Its terminating line break remains available to layout processing.

    Причина

    One comment opener covers both explanatory lines and trailing comments. Preserving its terminating line break keeps comments from joining surrounding statements.

    Правилоtopaz.lexical-structure.rule.block-comments

    Block comment spellings are rejected

    Write every comment line with //. The /* ... */ spelling is rejected with TPZ2001 during parsing. Its opener is tokenized as ordinary / and * punctuation. Comment markers inside a string remain text.

    Причина

    Line comments give ignored source text one spelling. Prefixing each line handles a paragraph of commentary without a closing delimiter or a nesting exception. Line comments also preserve the physical break that separates surrounding statements. A block comment and successive line comments express the same intent to set explanatory text aside. A short mid-line comment can move to a preceding line without changing that intent.

    Line breaks and statement boundaries

    Ссылка
    EBNF
    1. StatementSeparator = StatementNewline ;

    StatementNewline denotes a significant LF, CRLF, or CR line ending. A semicolon is rejected. Blocks and control flow defines final values and explicit discard.

    Правилоtopaz.lexical-structure.rule.statement-separators

    Statement boundaries

    LF, CRLF, and bare CR separate completed items at program level and in statement blocks when no continuation condition applies, including the break that ends a line comment. A semicolon is rejected and never discards a value. Blank lines do not introduce an extra item. No implicit separator is inserted immediately before a closing delimiter or the end of the source. The final expression remains the block value across trailing line breaks and comments. To discard that value explicitly, write let _ = expression.

    Причина

    A semicolon separator and a line boundary both separate completed statements. Newlines express that separation. Discarding a result is a different intent and is written explicitly with let _ = expression. Trailing whitespace and comments therefore leave the final expression value unchanged.

    Правилоtopaz.lexical-structure.rule.delimiter-continuation

    Line breaks inside delimiter forms

    A line break continues the surrounding form while its active context is parentheses, square brackets, interpolation, record fields, or import selections. An explicit ; in those contexts produces TPZ1001. Use , between list elements.

    Причина

    The enclosing delimiter identifies an unfinished expression or list. Commas keep element boundaries explicit when a long form spans several lines.

    Правилоtopaz.lexical-structure.rule.token-continuation

    Continuation around tokens

    A newline continues the form at these token positions.

    Position of the line breakToken spellings
    Before>, >>, else
    After+, -, !, ~, ,, =>, (, [
    Either side**, *, /, %, .., ..<, <, <=, >=, ==, !=, in, &&, \|\|, ??, =, +=, -=, *=, /=, %=, ??=, ., ?., by

    Причина

    Continuation keeps an unfinished operator expression together. The lexer records line breaks and the layout pass uses adjacent tokens to decide its boundaries.

    Правилоtopaz.lexical-structure.rule.pattern-continuation

    Continuation around pattern alternatives

    A line break on either side of | continues a binding, case, or for pattern while that pattern is being read.

    Причина

    The alternatives belong to one pattern. Keeping them together lets the same binding requirements apply across a multiline alternative list.

    Collections and comprehensions, Modules and visibility, and Functions and generics own list grammars. Expressions and operators owns precedence. Pattern matching owns pattern grammar.

    Explicit call type arguments have a recorded implementation limitation involving the gap between > and (. Its intended contract and workaround remain in Functions and generics. That spacing-sensitive behavior does not add a lexical prohibition.

    Source locations

    Ссылка
    Правилоtopaz.lexical-structure.rule.unknown-character

    Unknown source characters

    An unrecognized source character produces TPZ0001 at that character's location.

    Причина

    Rejecting an unknown character at its location prevents silent removal from changing a program.

    Правилоtopaz.lexical-structure.rule.source-positions

    Diagnostic source positions

    CLI diagnostic labels use 1-based line, col, endLine, and endCol. Columns count Unicode scalar values from the start of the line. The lo and hi fields use 0-based UTF-8 byte offsets. Both end positions are exclusive.

    Причина

    Scalar columns locate characters without depending on UTF-8 byte width. Byte offsets address exact source slices, and exclusive ends compose adjacent spans.

    Examples and non-examples

    Ссылка

    Identifier spellings and contextual names

    Ссылка
    example.tpzIdentifier spellings and contextual namesОткрыть песочницу →
    1. let answer_2: int = 42
    2. let 값: int = answer_2
    3. let 🟦: int = 값
    4. let ifx: int = 🟦
    5. let record: int = ifx
    6. let loop: int = record
    Зафиксированный выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Зафиксировано с Топазом 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Наблюдаемые утверждения · Пройдено · 5.21.3

    Код завершения 0.

    Нет стандартного вывода.

    Нет вывода ошибок.

    • Пройдено · expected 0; observed 0
    • Пройдено · expected 0; observed 0
    • Пройдено · expected 0; observed 0
    • Пройдено · expected 0; observed 0

    Comments and continued expressions

    Ссылка
    example.tpzComments and continued expressionsОткрыть песочницу →
    1. // A comment occupies its prefixed line.
    2. let first: int = 1 // A line comment.
    3. let second: int =
    4. first +
    5. 2
    6. let third: int = (second
    7. * 2)
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    The retired block opener is rejected without a closer

    Ссылка
    example.tpzThe retired block opener is rejected without a closerОткрыть песочницу →
    1. let value: int = 1
    2. /* unfinished
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    A line comment needs no closing delimiter

    Ссылка
    example.tpzA line comment needs no closing delimiterОткрыть песочницу →
    1. let value: int = 1
    2. // A line comment also ends at the end of the source.
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    A semicolon in an array list

    Ссылка
    example.tpzA semicolon in an array listОткрыть песочницу →
    1. let values: Array<int> = [1; 2]
    Зафиксированный выводКод завершения 1
    Нет стандартного вывода.
    error[TPZ1001]: `;` does not separate items inside a delimiter list; use `,`
     --> example.tpz:1:28
      |
    1 | let values: Array<int> = [1; 2]
      |                            ^
    
    error[TPZ2001]: expected `]`
     --> example.tpz:1:30
      |
    1 | let values: Array<int> = [1; 2]
      |                              ^
    
    error[TPZ2001]: expected an expression
     --> example.tpz:1:31
      |
    1 | let values: Array<int> = [1; 2]
      |                               ^
    
    error[TPZ2001]: expected a statement
     --> example.tpz:1:31
      |
    1 | let values: Array<int> = [1; 2]
      |                               ^
    
    example.tpz: 4 diagnostics
    
    $ topaz check example.tpz --compiler self · Зафиксировано с Топазом 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения layout. Ненулевой код завершения.

    • TPZ1001 →

      semicolon-in-delimiter-list at example.tpz:1:28

    Наблюдаемые утверждения · Пройдено · 5.21.3

    Код завершения 1.

    Нет стандартного вывода.

    Наблюдаемый вывод ошибок
    1. error[TPZ1001]: `;` does not separate items inside a delimiter list; use `,`
    2. --> example.tpz:1:28
    3. |
    4. 1 | let values: Array<int> = [1; 2]
    5. | ^
    6. error[TPZ2001]: expected `]`
    7. --> example.tpz:1:30
    8. |
    9. 1 | let values: Array<int> = [1; 2]
    10. | ^
    11. error[TPZ2001]: expected an expression
    12. --> example.tpz:1:31
    13. |
    14. 1 | let values: Array<int> = [1; 2]
    15. | ^
    16. error[TPZ2001]: expected a statement
    17. --> example.tpz:1:31
    18. |
    19. 1 | let values: Array<int> = [1; 2]
    20. | ^
    21. example.tpz: 4 diagnostics
    • Пройдено · checking TPZ1001; cause semicolon-in-delimiter-list; primary location asserted; additional diagnostics allow
    • Пройдено · expected nonzero; observed 1

    Separate array elements with a comma

    Ссылка
    example.tpzSeparate array elements with a commaОткрыть песочницу →
    1. let values: Array<int> = [1, 2]
    Зафиксированный выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Зафиксировано с Топазом 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Наблюдаемые утверждения · Пройдено · 5.21.3

    Код завершения 0.

    Нет стандартного вывода.

    Нет вывода ошибок.

    • Пройдено · expected 0; observed 0

    A keyword used as a function name

    Ссылка
    example.tpzA keyword used as a function nameОткрыть песочницу →
    1. function if() { }
    Зафиксированный выводКод завершения 1
    Нет стандартного вывода.
    error[TPZ2001]: expected a function name
     --> example.tpz:1:10
      |
    1 | function if() { }
      |          ^^
    
    example.tpz: 1 diagnostic
    
    $ topaz check example.tpz --compiler self · Зафиксировано с Топазом 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    Наблюдаемые утверждения · Пройдено · 5.21.3

    Код завершения 1.

    Нет стандартного вывода.

    Наблюдаемый вывод ошибок
    1. error[TPZ2001]: expected a function name
    2. --> example.tpz:1:10
    3. |
    4. 1 | function if() { }
    5. | ^^
    6. example.tpz: 1 diagnostic
    • Пройдено · checking TPZ2001; cause expected-function-name; primary location asserted; additional diagnostics allow
    • Пройдено · checking TPZ2001; cause expected-function-name; primary location asserted; additional diagnostics allow
    • Пройдено · expected nonzero; observed 1

    Give the function an identifier

    Ссылка
    example.tpzGive the function an identifierОткрыть песочницу →
    1. function choose() { }
    Зафиксированный выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Зафиксировано с Топазом 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    Наблюдаемые утверждения · Пройдено · 5.21.3

    Код завершения 0.

    Нет стандартного вывода.

    Нет вывода ошибок.

    • Пройдено · expected 0; observed 0
    • Пройдено · expected 0; observed 0

    An unknown character after a Unicode name

    Ссылка
    example.tpzAn unknown character after a Unicode nameОткрыть песочницу →
    1. let 이름 = @
    Зафиксированный выводКод завершения 1
    Нет стандартного вывода.
    error[TPZ0001]: unknown character `@`
     --> example.tpz:1:10
      |
    1 | let 이름 = @
      |          ^
    
    error[TPZ2001]: expected an expression
     --> example.tpz:2:1
      |
    2 | 
      | ^
    
    example.tpz: 2 diagnostics
    
    $ topaz check example.tpz --compiler self · Зафиксировано с Топазом 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    • TPZ0001 →

      unknown-source-character at example.tpz:1:10

    Наблюдаемые утверждения · Пройдено · 5.21.3

    Код завершения 1.

    Нет стандартного вывода.

    Наблюдаемый вывод ошибок
    1. error[TPZ0001]: unknown character `@`
    2. --> example.tpz:1:10
    3. |
    4. 1 | let 이름 = @
    5. | ^
    6. error[TPZ2001]: expected an expression
    7. --> example.tpz:2:1
    8. |
    9. 2 |
    10. | ^
    11. example.tpz: 2 diagnostics
    • Пройдено · checking TPZ0001; cause unknown-source-character; primary location asserted; additional diagnostics allow
    • Пройдено · checking TPZ0001; cause unknown-source-character; primary location asserted; additional diagnostics allow
    • Пройдено · expected nonzero; observed 1

    This example exercises the primary line and scalar column. Byte offsets and end positions remain pending product verification.

    LF separates completed statements

    Ссылка
    example.tpzLF separates completed statementsОткрыть песочницу →
    1. import std.io
    2. let value = 1
    3. -2
    4. io.writeLine("{value}")
    Ожидаемый выводКод завершения 0
    1
    
    $ topaz run example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 1

    A block comment with LF is rejected

    Ссылка
    example.tpzA block comment with LF is rejectedОткрыть песочницу →
    1. import std.io
    2. let value = 1 /* before
    3. after */ +2
    4. io.writeLine("{value}")
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    LF ends a line comment

    Ссылка
    example.tpzLF ends a line commentОткрыть песочницу →
    1. import std.io
    2. // comment
    3. io.writeLine("after")
    4. io.writeLine("tail")
    Ожидаемый выводКод завершения 0
    after
    tail
    
    $ topaz run example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. after
    2. tail

    CRLF separates completed statements

    Ссылка
    example.tpzCRLF separates completed statementsОткрыть песочницу →
    1. import std.io
    2. let value = 1
    3. -2
    4. io.writeLine("{value}")
    Ожидаемый выводКод завершения 0
    1
    
    $ topaz run example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 1

    A block comment with CRLF is rejected

    Ссылка
    example.tpzA block comment with CRLF is rejectedОткрыть песочницу →
    1. import std.io
    2. let value = 1 /* before
    3. after */ +2
    4. io.writeLine("{value}")
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    CRLF ends a line comment

    Ссылка
    example.tpzCRLF ends a line commentОткрыть песочницу →
    1. import std.io
    2. // comment
    3. io.writeLine("after")
    4. io.writeLine("tail")
    Ожидаемый выводКод завершения 0
    after
    tail
    
    $ topaz run example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. after
    2. tail

    Bare CR separates completed statements

    Ссылка
    example.tpzBare CR separates completed statementsОткрыть песочницу →
    1. import std.io
    2. let value = 1 -2
    3. io.writeLine("{value}")
    Ожидаемый выводКод завершения 0
    1
    
    $ topaz run example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. 1

    A block comment with CR is rejected

    Ссылка
    example.tpzA block comment with CR is rejectedОткрыть песочницу →
    1. import std.io
    2. let value = 1 /* before after */ +2
    3. io.writeLine("{value}")
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    Bare CR ends a line comment

    Ссылка
    example.tpzBare CR ends a line commentОткрыть песочницу →
    1. import std.io
    2. // comment io.writeLine("after")
    3. io.writeLine("tail")
    Ожидаемый выводКод завершения 0
    after
    tail
    
    $ topaz run example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Выполнение завершается. Код завершения 0.

    Ожидаемый стандартный вывод
    1. after
    2. tail

    A block comment on one line is rejected

    Ссылка
    example.tpzA block comment on one line is rejectedОткрыть песочницу →
    1. import std.io
    2. let value = 1 /* no line break */ +2
    3. io.writeLine("{value}")
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    Parentheses do not admit block comments

    Ссылка
    example.tpzParentheses do not admit block commentsОткрыть песочницу →
    1. import std.io
    2. let value = (1 /* before after */ +2)
    3. io.writeLine("{value}")
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    Adjacent declarations need a statement boundary

    Ссылка
    example.tpzAdjacent declarations need a statement boundaryОткрыть песочницу →
    1. let first = 1 let second = 2
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    • TPZ2001 →

      expected-statement-separator at example.tpz:1:15

    A newline separates commented items

    Ссылка
    example.tpzA newline separates commented itemsОткрыть песочницу →
    1. let first = 1
    2. let second = 2 // The newline separates the items.
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    A semicolon cannot separate program items

    Ссылка
    example.tpzA semicolon cannot separate program itemsОткрыть песочницу →
    1. let first = 1; let second = 2
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    • TPZ2001 →

      expected-statement-separator at example.tpz:1:14

    A semicolon cannot discard a block tail

    Ссылка
    example.tpzA semicolon cannot discard a block tailОткрыть песочницу →
    1. function value() { 7; }
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения parse. Ненулевой код завершения.

    • TPZ2001 →

      expected-statement-separator at example.tpz:1:21

    Combining marks continue NFC names

    Ссылка
    example.tpzCombining marks continue NFC namesОткрыть песочницу →
    1. let q́: int = 1
    2. let का: int = q́
    3. let x⃝: int = का
    4. loop 'q́ { break 'q́ }
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    q + U+0301 is Mn, U+093E in का is Mc, and U+20DD in x⃝ is Me. Each complete name is already NFC.

    Use the NFC spelling throughout the source

    Ссылка
    example.tpzUse the NFC spelling throughout the sourceОткрыть песочницу →
    1. let café: int = 1
    2. let 가: int = 2
    3. let K: int = 3
    4. let value: int = café + 가 + K
    Ожидаемый выводКод завершения 0
    Нет стандартного вывода.
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Проверка принимает программу. Код завершения 0.

    A combining mark cannot start a name

    Ссылка
    example.tpzA combining mark cannot start a nameОткрыть песочницу →
    1. let ́name = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    The leading scalar is U+0301 COMBINING ACUTE ACCENT.

    Reject an invisible Hangul filler at the start

    Ссылка
    example.tpzReject an invisible Hangul filler at the startОткрыть песочницу →
    1. let ᅟname = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    U+115F HANGUL CHOSEONG FILLER is a Letter and Default_Ignorable_Code_Point.

    Reject an invisible Hangul filler in a name

    Ссылка
    example.tpzReject an invisible Hangul filler in a nameОткрыть песочницу →
    1. let aㅤ = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    U+3164 HANGUL FILLER is excluded even though its General_Category is Lo.

    Reject a variation selector in a name

    Ссылка
    example.tpzReject a variation selector in a nameОткрыть песочницу →
    1. let ✈️ = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    The rejected scalar is U+FE0F VARIATION SELECTOR-16. Use the admitted name ✈ without the selector.

    Reject a joiner in an emoji name

    Ссылка
    example.tpzReject a joiner in an emoji nameОткрыть песочницу →
    1. let 👩‍💻 = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    The rejected scalar is U+200D ZERO WIDTH JOINER. A displayed emoji cluster does not override scalar admission.

    Reject a combining grapheme joiner

    Ссылка
    example.tpzReject a combining grapheme joinerОткрыть песочницу →
    1. let a͏ = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    U+034F COMBINING GRAPHEME JOINER is Mn and Default_Ignorable_Code_Point. The exclusion takes precedence over combining-mark continuation.

    Reject decomposed source names

    Ссылка
    example.tpzReject decomposed source namesОткрыть песочницу →
    1. let café = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    NFC spells this complete name café.

    Reject composable Hangul jamo in a name

    Ссылка
    example.tpzReject composable Hangul jamo in a nameОткрыть песочницу →
    1. let 가 = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    The name contains U+1100 and U+1161. NFC replaces the sequence with U+AC00 가.

    Reject a scalar with a different NFC spelling

    Ссылка
    example.tpzReject a scalar with a different NFC spellingОткрыть песочницу →
    1. let K = 1
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    U+212A KELVIN SIGN has the canonical NFC spelling U+004B K. This is a canonical normalization rule, not NFKC or case folding.

    Apply NFC to label bodies

    Ссылка
    example.tpzApply NFC to label bodiesОткрыть песочницу →
    1. loop '가 { break }
    Ожидаемый выводНенулевой код завершения
    $ topaz check example.tpz --compiler self --format json · Целевой продукт 5.21.3
    Ожидаемый результат

    Ожидаемый результат

    Этап отклонения lex. Ненулевой код завершения.

    The primary name span excludes the opening apostrophe. Write the label body 가.

    Related reference

    Ссылка

    Literals and templates →

    Functions and generics →

    Unknown character →

    Semicolon in delimiter list →

    Unexpected token →

    Source name is not NFC →

    Меню

    Загрузка →