Benutzer-Werkzeuge

Webseiten-Werkzeuge


Dies ist eine alte Version des Dokuments!


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

daedalus/ebnf.1439928935.txt.gz · Zuletzt geändert: 2016/12/31 10:11 (Externe Bearbeitung)