====== 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: [[http://de.wikipedia.org/wiki/EBNF]] [[http://www.cl.cam.ac.uk/~mgk25/iso-14977.pdf]] Die folgende Grammatik ist höchstwahrscheinlich nicht vollständig. Edit: Ich (Lehona), habe eine neue Version hochgeladen, die zu großen Teilen völlig neu geschrieben wurde und Daedalus wesentlich passender beschreibt, in der alten Version gab es schrecklich viele Unstimmigkeiten. Die Notation ist damit formal nicht ganz korrekt, ich habe mich eher an der boost::spirit-Notation orientiert(der Stern für Wiederholung ist z.B. vor dem Ausdruck anstatt nach dem Ausdruck), aber eigentlich kompatibel. ===== Schlüsselwörter ===== class const else float func if instance int other prototype return self string this var void ===== Lexikalik ===== 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 = +digit ; float = ["+" | "-"] (+digit '.' *digit | *digit '.' +digit | +digit); ===== Ausdrücke ===== bool_op = "||" | "&&" ; cmp_op = "<" | "<=" | ">" | ">=" | "==" | "!=" ; un_op = "!" | "~" | "+" | "-" ; calc_hip_op = "+" | "-" ; calc_lop_op = "*" | "/" | "%" ; bit_op = "&" | "|" | "<<" | ">>" ; bin_op = bool_op | cmp_op | calc_hip_op | calc_lop_op | bit_op ; expression_list = [expression *("," expression)] ; call_exp = identifier "(" expression_list ")" ; Expr = Term | Term calc_hip_op Term ; Term = Factor | Factor calc_lop_op Factor ; Factor = Num | "(" Expr ")" ; Num = Integer | call_exp ; expression = Expr | String | Float prim_expr = *un_op (identifier["."identifier] | integer | call_statement) ; ===== Anweisungen ===== statement_list = *(statement ";") ; statement = (assignment_statement | if_block | jump_statement | call_statement | identifier) ";" assignment_statement = identifier["." identifier] "=" expression ; statement_block = "{" statement_list "}" ; if_statement = "if" expression statement_block ; if_block = if_statement *("else" if_statement) ["else" statement_block] ; jump_statement = "return" [expression] ";" ; call_statement = call_exp ";" ; ===== Deklarationen ===== declaration_list = declaration *("," declaration) ; declaration_block = "{" +object_decl "};" ; declaration = object_decl | type_decl ; cv_spec = "const" | "var" ; prim_type = "integer" | "string" | "float" object_decl = cv_spec identifier ["[" (identifier|integer) "]"] ";" type_decl = class_decl | prototype_decl | instance_decl ; class_decl = "class" identifier declaration_block ; prototype_decl = "prototype" identifier "(" class_identifier ")" declaration_block ; instance_decl = "instance" identifier "(" class_identifier ")" (statement_block|";") ; function_decl = "func" identifier "(" [declaration_list] ")" statement_block ;