COSC3308     

     Example of an Operational Semantic.                  Fall 2013
     
     0. Abstract Program
     
         is-abstract-program     =   is-statement-list
         is-statement-list       =   is-statement | is-statement-list is-statement
         is-statement            =   is-assignment-statement |
                                     is-if-statement | is-loop-statement |
                                     is-input-statement | is-output-statement
         is-assignment-statement =   ([s-variable : is-variable],
                                      [s-expression : is-expression])
         is-if-statement         =   ([s-compare : is-compare],
                                      [s-then-clause : is-statement-list],
                                      [s-else-clause : is-statement-list])
         is-loop-statement       =   ([s-compare : is-comparison],
                                      [s-body : is-statement-list])
         is-input-statement      =   ([s-read : is-variable-list])
         is-output-statement     =   ([s-write : is-variable-list])
         is-comparison           =   ([s-left-operand : is-operand],
                                      [s-right-operand : is-operand],
                                      [s-operator : is-comparison-opr])
         is-expression           =   is-integer | is-variable | is-infix-exp
         is-infix-exp            =   ([s-left-operand : is-operand],
                                      [s-right-operand : is-operand],
                                      [s-operator : is-arithmetic-opr])
         is-operand              =   is-integer | is-variable | is-expression
         is-comparison-opr       =   is-LT | is-EQ | is-NE | is-GT
         is-arithmetic-opr       =   is-plus | is-minus | is-multiply
         is-variable             =   ([s-address : is-integer])
          
     1. Syntax
     
         PROG                    ::= Program Declaration-sequence
                                         begin Statement-sequence end ;
         Declaration-sequence    ::= Declaration | 
                                     Declaration Declaration-sequence
         Statement-sequence      ::= statement |
                                     Statement statement-sequence
         Declaration             ::= Identifier-list : Integer ;
         Identifier-list         ::= Identifier |
                                     Identifier , Identifier-list
         Statement               ::= Assignment-statement |
                                     If-statement |
                                     Loop-statement |
                                     Input-statement |
                                     Output-statement
         Assignment-statement    ::= Identifier := Expression ;
         If-statement            ::= if Comparison then Statement-sequence
                                         endif ;             |
                                     if Comparison then Statement-sequence
                                         else Statement-sequence endif ;
         Loop-statement          ::= While Comparison loop
                                         Statement-sequence endloop ;
         Input-statement         ::= input Identifier-list ;
         Output-statement        ::= output identifier-list ;
         Comparison              ::= ( Operand Comparison-opr Operand )
         Expression              ::= Factor | Expression + Factor |
                                              Expression - Factor
         Factor                  ::= Operand | Factor * Operand
         Operand                 ::= Integer | Identifier | ( Expression )
         Comparison-opr          ::= < | = | != | >
         Identifier              ::= Letter | Identifier Letter |
                                         Identifier Digit
         Integer                 ::= Digit | Integer Digit
         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
         Digit                   ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
     
     
     2. VDL Semantic definition.
     
     execute-statement-sequence(sequence) =
         is<>(sequence) --> Halt
         T  --> execute-statement-sequence(tail(sequence))
                execute-statement(head(sequence))
     execute-statement(statement) =
         is-assignment-statement(statement) --> execute-assign(statement)
         is-if-statement(statement) --> execute-if(statement)
         1s-loop-statement(statement) --> execute-loop(statement)
         is-input-statement(statement) --> execute-input(statement)
         is-output-statement(statement) --> execute-output(statement)    
     execute-assign(statement) =
         store(s-address.s-variable(statement),value)
           value: evaluate-expression(s-expression(statement))
     execute-if(statement) =
         evaluate-comparison(s-compare(statement)) = T -->
           execute-statement-sequence(s-then-clause(statement))
         T --> execute-statement-sequence(s-else-clause(statement))
     execute-loop(statement) =
         evaluate-comparison(s-compare(statement)) = T -->
           execute-loop(statement)
           execute-statement-sequence(s-body(statement))
     execute-input(statement) = input(s-read(statement))
     execute-output(statement) = output(s-write(statement))
     evaluate-expression(expression) = 
         is-integer(expression) --> PASS: expression
         is-variable(expression) --> evaluate-variable(expression)
         T --> calculate(left-value,right-value,s-operator(expression))
            left-value:  evaluate-expression(s-left-operand(expression))
            right-value: evaluate-expression(s-right-operand(expression))
     evaluate-comparison(comparison) =
         compare(left-value,right-value,s-operator(comparison))
           left-value:  evaluate-expression(s-left-operand(comparison))
           right-value: evaluate-expression(s-right-operand(comparison))
     calculate(value1,value2,operator) = 
         is-plus(operator) --> PASS: Value1+value2
         is-minus(operator) --> PASS: value1-value2
         is-multiply(operator) --> PASS: value1*value2
     compare(value1,value2,operator) =
         is-LT(operator) & (value1 < value2) --> PASS: T
         is-EQ(operator) & (value1 = value2) --> PASS: T
         is-NE(operator) & (value1 <> value2) --> PASS: T
         is-GT(operator) & (value1 > value2) --> PASS: T
         T  --> PASS: F
     evaluate(variable) = 
         is-UNDEFINED(elem(s-address(variable))s-storage(Abstract-Machine)))
             --> ERROR
         T -->   PASS:elem(s-address(variable))s-storage(Abstract-Machine))
     store(location,value) =
         s-storage:MU(s-storage(Abstract-Machine);[elem(location):value])
     input(variables) =
         is<>(variables) --> Nothing to do
         T --> input(tail(variables))
                 store(s-address(head(variables)),value)
                 value: input-file
     input-file =
         is<>(s-input(Abstract-Machine)) --> ERROR
         T  -->  MU(Abstract-Machine: [s-input:tail(s-input(AM))])
     output(variables) =
         is<>(variables) --> Nothing to do
         T  --> output(tail(variables)
                  output-file(value)
                  value: evaluate-variable(head(variables))
     output-file(value) = MU(AM: [s-output: s-output(AM) concat value])