document = prologue, declaration, EOF ; prologue = "TCS", version, ";" ; version = integer, ".", integer ; declaration = declaration_kind, identifier, block ; declaration_kind = "PROGRAM" | "MODULE" | "PROTOCOL" | "COMPILER" | "EVENT" | "RECEIPT" ; block = "{", { member }, "}" ; member = identifier, ( typed_assignment | assignment | block ) ; typed_assignment = ":", type_expression, "=", value, ";" ; assignment = "=", value, ";" ; value = string | integer | boolean | null | identifier | array | inline_object ; array = "[", [ value, { ",", value } ], "]" ; inline_object = "{", [ pair, { ",", pair } ], "}" ; pair = identifier, ":", value ; type_expression = identifier, [ "<", type_expression, { ",", type_expression }, ">" ] ; boolean = "true" | "false" ; null = "null" ; integer = [ "-" ], digit, { digit } ; identifier = identifier_start, { identifier_continue } ; identifier_start = unicode_letter | "_" ; identifier_continue = unicode_letter | digit | "_" | "-" | "." | "/" | ":" | "@" ; string = '"', { json_string_character }, '"' ; line_comment = "//", { any_character_except_line_break } ; block_comment = "/*", { any_character_not_closing_comment }, "*/" ; whitespace = " " | "\t" | "\n" | line_comment | block_comment ; (* v0.1 语法闭合规则 *) (* PROGRAM 必需区块由字段标准校验,不在词法解析时猜测。 *) (* 未知顶层关键字、重复字段、重复区块和尾随 token 全部拒绝。 *) (* 字段顺序不改变语义哈希;列表顺序保留。 *)