Inhaltsverzeichnis

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 ;