Beschreibung der vorgeschlagenen Syntax (Grammatik) für die Script-Sprache für den "Logik-Editor"


Autor:  Menno Rubingh
Datum:  2009 Feb 16


Notation Bedeutung
GROSS
Built-in Keyword
(Notation: Fett, alles Grossbuchstaben)
klein
Identifier (Name einer PROC, FUNC, TYPE, oder Variabele)
(Notation: Fett, alles Kleinbuchstaben
Abc Nonterminal
(Notation: Italics, nicht Fett, Mix von gross und klein)
End Of Line
Abc Einfache optionale wiederholung:
Steht für: 0 oder mehr Male wiederholen von Abc.
Abc , Optionale wiederholung mit Trennzeichen:
Steht für:
entweder   nichts (leer)
oder Abc
oder Abc , Abc
oder Abc , Abc , Abc
oder ... usw.
D.h. das Trennzeichen nur zwischen den Elementen.
  Abc
     
     
     
Diese graphische Figur bezeichnet die Liste aller productions für Abc, d.h. aller Alternativen (entweder...oder...oder...) wie der Nonterminal Abc aufgelöst werden kann.
Jede einzelne prodiction kann in ihrer Darstellung in der Syntax-Spezifikation unten auch line breaks enthalten: Diese sind nur für die visuelle Darstellung da, zu leichterem Lesen, und stehen nicht für das input Token "".




[NB: Das Zeilen-weiterführungszeichen "_" wird vom Tokenizer aufgelöst, und ist daher nicht da in der vom Parser zu verarbeitenden Token-Sequenz.]




SYNTAX


1. Ein Programm ist eine ungeordnete Menge von PROC-, FUNC-, und TYPE-Definitionen:

    Program     
           PFTDef 

    PFTDef     
          ProcDefinition
          FuncDefinition
          TypeDefinition   //Später

NB: Die Namen der von einem Script verwendeten PROCS und FUNCS (und später auch: TYPEs) sind alle unterschiedlich. (D.h.: Alle in der gleichen namespace.)


2. PROC-, FUNC- und TYPE-Definitionen sehen so aus:

    ProcDefinition     
          PROC procname (  TypeSpec paramname  ,  ) 
             StatementBlock
          END PROC 

    FuncDefinition     
          FUNC TypeSpec funcname (  TypeSpec paramname  ,  ) 
             StatementBlock
          END FUNC 

    TypeDefinition                  //Später
          TYPE typename 
              TypeSpec fieldname  
          END TYPE 


    TypeSpec
          BOOL
          INT
          REAL
          STRING
          STRING_T
          ARRAY < TypeSpec >


3. Statements

Ein StatementBlock ist eine geordnete Liste von Statements:
    StatementBlock
           Statement 

Es gibt die folgenden Arten von Statements:

    Statement
          EmptyStatement      // Leerzeile erlaubt in statement block
          VarDeclStatement    // Deklaration einer Variabele
          AssignmentStatement // Zuweisung
          IfStatement         // IF
          WhileStatement      // WHILE
          ForStatement        // FOR
          ProcCallStatement   // PROC Aufruf
          ReturnStatement     // Return aus FUNC
Das ReturnStatement ist nur erlaubt innerhalb einer FuncDefinition.

Jede Art Statement hat ihren eigenen Syntax:

    EmptyStatement
            //Leerzeile

    VarDeclStatement
          VAR TypeSpec varname 
          VAR TypeSpec varname = Expression 

    AssignmentStatement
          varname  = Expression 
          arrayname [ Expression ]  = Expression   //Array element
          varname . fieldname  = Expression         //Später für TYPE

    IfStatement
          IF Expression 
              StatementBlock
          END IF 

    WhileStatement
          WHILE Expression 
              StatementBlock
          END WHILE 

    ForStatement
          FOR varname = Expression .. Expression 
              StatementBlock
          END FOR 

    ProcCallStatement
          procname (  Expression   ,  ) 
          stringname . procname (  Expression   ,  )   //Builtin STRING PROC
          arrayname  . procname (  Expression   ,  )   //Builtin ARRAY PROC

    ReturnStatement 
          RETURN Expression 
Die Expressions in IF- und WHILE-statements müssen einen BOOL zurückgeben; die Expressions in einem FOR-statement müssen INT-Werte zurückgeben.


4. Expressions

Eine Expression liefert einen Return-Wert, ein Statement nicht.
    Expression
          SimpleLiteral
          {  Expression  ,  }  //Gibt eine Array zurück

          varname
          arrayname [ Expression ]   //Array element
          varname . fieldname        //Später für TYPE

          funcname (  Expression   ,  )              //FUNC-Aufruf
          stringname . funcname (  Expression   ,  )   //Builtin STRING FUNC
          arrayname  . funcname (  Expression   ,  )   //Builtin ARRAY FUNC

          ( Expression )
          PrefixOperator  Expression
          Expression  InfixOperator  Expression
NB: Für die Auflösung der letzteren Möglichkeit muss der Parser die operator precedence der infix-Operatoren berücksichtigen.

    SimpleLiteral
          TRUE     //Bool
          FALSE

          Literal integer, zB: 73
          Literal real, zB: 1.2e-4
          String literal in double quotes, zB: "abc"

          NEWL      //Keywords die einen string zurückgeben
          SPACE
          TAB
          DQUOTE
          SQUOTE
    

    PrefixOperator
          NOT
    
          +
          -


    InfixOperator
          AND
          OR

          >
          <
          =          //Überprüfung auf Gleichheit, nicht Zuweisung
          >=
          <=

          +
          -
          *
          /