This page describes the syntax of the Amber language, by means of an informal BNF grammar. See also Lexical elements.
Amber_system: Amber_script {Amber_class} Amber_script: {Instruction} [Feature_blocks "end"]
Amber_class: "class" Class_name ([External_part] | [Inheritance]) [Include_part] [Load_part] [Creation_block] [Feature_blocks] [Class_invariant] "end" Class_name: Upper_identifier External_part: "external" ("parrot" | "pmc") Parrot_class_identifier Include_part: "include" Filename {[","] Filename} Load_part: "load" Filename {[","] Filename} Filename: Manifest_string_constant Parrot_class_identifier: '@@' Extended_identifier Inheritance: "inherit" Parent {"," Parent} Creation_block: "creation" Feature_block Feature_blocks: {("public" | "private") Feature_block}+ Feature_block: {Named_feature} Class_invariant: "invariant" {Expression}
Named_feature: Feature_name [Formal_arguments] [Precondition] [Local_declarations] [Feature_body] Feature_name: Lower_identifier | Parrot_feature_identifier Parrot_feature_identifier: '@' Extended_identifier Formal_arguments: "(" Formal_argument {"," Formal_argument} ")" Formal_argument: Lower_identifier Precondition: "require" {Assertion} Local_declarations: "local" [Local_variable_chain] Local_variable_chain: Local_variable [','] [Local_variable_chain] Local_variable: Lower_identifier Feature_body: Do_part | External_part | Is_part Do_part: "do" {Instruction} Rescue_finally_ensure External_part: "external" External_language_name {External_code_line}+ Rescue_finally_ensure External_language_name: "pir" External_code_line: Manifest_string_constant Is_part: "is" Expression Rescue_finally_ensure Rescue_finally_ensure: [Rescue_part] [Finally_part] [Postcondition] Rescue_part: "rescue" {Instruction} Finally_part: "finally" {Instruction} Postcondition: "ensure" {Assertion} Assertion: Expression
Instruction: Assignment_instruction | If_instruction | Loop_instruction | Call_instruction | Check_instruction | Retry_instruction | Recover_instruction | ";" Instruction | Instruction ";" Assignment_instruction: Target ":=" Source Source: Expression Target: Expression If_instruction: "if" Expression "then" {Instruction} [Elseif_instruction_chain] ["else" {Instruction}] "end" Elseif_instruction_chain: "elseif" Expression "then" Instructions [Elseif_instruction_chain] Inspect_instruction: "inspect" Expression [ When_chain ] [ "else" {Instruction} ] "end" When_chain: "when" Expression {"," Expression} "then" {Instruction} [When_chain] Loop_instruction: "loop" {Instruction} {Loop_tail} "repeat" Loop_tail: [Loop_invariant] [Loop_variant] "until" Expression {Instruction} Loop_invariant: "invariant" Assertion Loop_variant: "variant" Assertion Call_instruction: Simple_expression Check_instruction: "check" Expression Retry_instruction: "retry" Recover_instruction: "recover"
Expression: Anonymous_routine | If_expression | Implies_expression Anonymous_routine: "agent" [Formal_arguments] [Outer_declarations] [Precondition] [Local_declarations] Feature_body Outer_declarations: "outer" Outer_variable_chain Outer_variable_chain: Outer_variable [','] [Outer_variable_chain] Outer_variable: Lower_identifier If_expression: "if" Expression "then" Expression [Elseif_expression_chain] "else" Expression "end" Elseif_expression_chain: 'elseif' Expression 'then' Expression [Elseif_expression_chain] Implies_expression: Or_expression {Implies_op Or_expression) Or_expression: And_expression {Or_op And_expression} And_expression: Compare_expression {And_op Compare_expression} Compare_expression: Add_expression [Compare_op Add_expression] Add_expression: Mul_expression {Add_op Add_expression} Mul_expression: Keyword_unary_expression {Mul_op Keyword_unary_expression} Keyword_unary_expression: Keyword_unary_op Keyword_unary_expression | Call_chain Call_chain: Symbol_unary_expression [Qualified_call_chain] Qualified_call_chain: "." Call [Subscript] [Qualified_call_chain] Symbol_unary_expression: Symbol_unary_op Symbol_unary_expression | Simple_expression [Subscript] Subscript: '[' Subscript_chain ']' Subscript_chain: Expression ["," Subscript_chain] Implies_op: 'implies' Or_op: 'or' | 'xor' And_op: 'and' Compare_op: '=' | '/=' | '<' | '<=' | '>=' | '>' Add_op: '+' | '-' | '&' Mul_op: '*' / '/' | '//' | 'mod' Unary_op: '+' | '-' | 'not'
Simple_expression: '(' Expression ')' | Result_expression | Call | Creation_expression | Manifest_string_constant | Manifest_boolean_constant | Manifest_integer_constant | Manifest_character_constant | Manifest_array | Manifest_table Result_expression: "result" Call: Amber_call | Dynamic_call Amber_call: Lower_identifier [Actual_arguments] Dynamic_call: Parrot_feature [Actual_arguments] Parrot_feature: '@' Extended_identifier Actual_arguments: '(' Actual_argument {"," Actual_argument} ')' Creation_expression: Class_name [Actual_arguments] | Dynamic_class_name Actual_arguments: '(' Actual_argument ("," Actual_argument)* ')' Dynamic_class_name: Parrot_class | Pmc_class Parrot_class: "@@" Extended_identifier Pmc_class: "@@." Extended_identifier Manifest_array: ['@'] '[' Expression {',' Expression} ']' Manifest_table: '{' Table_entry {',' Table_entry} '}' Table_entry: Table_key '=>' Table_value Table_key: Manifest_string_constant Table_value: Expression