Syntaxnotation
Die im folgenden verwendete Notation zur Beschreibung der Syntax nennt sich EBNF–Notation (Erweiterte Backus–Naur–Form). Es wurden die Regeln verwendet, wie sie im unten genannten Wikipedia-Artikel aufgeführt werden.
Weitergehende Informationen zu EBNF findet man hier:
Die folgende Grammatik ist höchstwahrscheinlich nicht vollständig.
Schlüsselwörter
class const else float func if
instance int other prototype return self
string this var void while
Lexikalische Syntax
identifier = letter { ( nondigit | digit ) } ;
graphic_char = ? alle sichtbaren Zeichen ? ;
letter = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N"
| "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
| "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n"
| "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" ;
nondigit = "_" | letter ;
string = '"' { graphic_char - '"'} '"' ;
digit = "0" | non_zero_digit ;
non_zero_digit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
integer = [sign] nonzero_digit {digit} | "0" ;
float = [sign] {digit}.{digit} ;
sign = "+" | "-" ;
Ausdrücke
bool_op = "||" | "&&" | "!" ;
cmp_op = "<" | "<=" | ">" | ">=" | "==" | "!=" ;
calc_op = "+" | "-" | "*" | "/" | "%" ;
bit_op = "&" | "|" | "<<" ;
operator = bool_op | cmp_op | calc_op | bit_op ;
name = identifier | function_call ;
indexed_component = name "[" integer "]" ;
selected_component = name "." identifier | name "->" identifier ;
function_call = name "(" [expression_list] ")" ;
expression = primary_expression ;
expression_list = expression {, expression} ;
primary_expression = integer | name | string ;
bit_expression = primary_expression {bit_op primary_expression} ;
calc_expression = bit_expression {calc_op bit_expression} ;
cmp_expression = calc_expression {cmp_op calc_expression} ;
bool_expression = cmp_expression {bool_op cmp_expression};
Anweisungen
statement_list = { statement ";"} ;
statement = compound_statement | simple_statement ;
simple_statement = assignment_statement | jump_statement ;
compound_statement = statement_block | if_statement ;
assignment_statement = identifier assignement_op expression ;
assignment_op = "=" ;
statement_block = "{" statement_list "};" ;
if_statement = "if" "(" expression ")" statement_block
{"else" statement_block} ;
jump_statement = "return" [expression] ;
call_statement = name "(" expression_list ")" ;
Deklarationen
declaration_list = { declaration ";" } ;
declaration_block = "{" declaration_list "};" ;
declaration = object_decl | type_decl ;
cv_spec = const | var ;
type_decl = class_decl | prototype_decl | instance_decl ;
base_classname = name ;
class_identifier = identifier;
class_decl = "class" class_identifier "(" base_classname ")" declaration_block ;
prototype_decl = "prototype" class_identifier identifier declaration_block ;
instance_decl = "instance" class_identifier identifier "(" class_identifier ")" declaration_block ;
function_decl = "func" type_identifier identifier "(" expression ")" statement_block ;