Nur ein AnkerSyntaxnotation

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.

Nur ein AnkerSchlüsselwörter


class const else float func if

instance int other prototype return self

string this var void


Nur ein AnkerLexikalik


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) ;

Nur ein Anker 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 ";" ;


Nur ein Anker 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 ;