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.
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 schrecklick 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);
[[Anchoer q4]]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 ;