diff --git a/bin/dune b/bin/dune index d0f4dc7..961c8b4 100644 --- a/bin/dune +++ b/bin/dune @@ -8,3 +8,21 @@ (package miniFun) (modes byte exe) ) + +(executable + (name miniFunInterpreter) + (public_name miniFunInterpreter) + (libraries miniFun + clap) + (package miniFun) + (modes byte exe) + ) + +(executable + (name miniImpInterpreter) + (public_name miniImpInterpreter) + (libraries miniImp + clap) + (package miniImp) + (modes byte exe) + ) \ No newline at end of file diff --git a/bin/fibonacci-fixed-point.minifun b/bin/fibonacci-fixed-point.minifun new file mode 100644 index 0000000..fccc7da --- /dev/null +++ b/bin/fibonacci-fixed-point.minifun @@ -0,0 +1,15 @@ +lambda n: int -> int => + +let fib = lambda f : (int -> int) -> int -> int => + \ n : int -> int => + if n == 0 then 0 + else if n == 1 then 1 + else f (n - 1) + f (n - 2) +in + +let rec fix f : ((int -> int) -> int -> int) -> int -> int = + \ x : int -> int => + f (fix f) x +in + +fix fib n diff --git a/bin/miller-rabin.miniimp b/bin/miller-rabin.miniimp new file mode 100644 index 0000000..5727cb6 --- /dev/null +++ b/bin/miller-rabin.miniimp @@ -0,0 +1,25 @@ +def main with input n output result as + if (n % 2) == 0 then result := 1 + else ( + + result := 0; + s := 0; + while (0 == ((n - 1) / (2 ^ s)) % 2) do ( + s := s + 1 + ); + d := ((n - 1) / 2 ^ s); + for (i := 20, i > 0, i := i - 1) do ( + a := rand(n - 4) + 2; + x := powmod(a, d, n); + for (j := 0, j < s, j := j+1) do ( + y := powmod(x, 2, n); + if (y == 1 && (not x == 1) && (not x == n - 1)) then + result := 1; + else + skip; + x := y; + ); + if not y == 1 then result := 1; + else skip; + ) + ) diff --git a/bin/miniFunInterpreter.ml b/bin/miniFunInterpreter.ml new file mode 100644 index 0000000..43bea4b --- /dev/null +++ b/bin/miniFunInterpreter.ml @@ -0,0 +1,100 @@ +open MiniFun +open Lexing + +(* -------------------------------------------------------------------------- *) +(* Command Arguments *) + +let () = + Clap.description "Interpreter for MiniFun language."; + + let files = Clap.section ~description: "Files to consider." "FILES" in + let values = Clap.section ~description: "Input values." "VALUES" in + + let input = Clap.mandatory_string + ~description: "Input file." + ~placeholder: "FILENAME" + ~section: files + ~long: "input" + ~short: 'i' + () + in + + let inputval = Clap.optional_int + ~description: "Optional input value to feed to the program. \ + If not specified it is read from stdin." + ~placeholder: "INT" + ~section: values + ~long: "value" + ~short: 'v' + () + in + + let output = Clap.optional_string + ~description: "Output file. If not specified output is printed on stdout." + ~placeholder: "FILENAME" + ~section: files + ~long: "output" + ~long_synonyms: ["out"; "result"] + ~short: 'o' + () + in + + Clap.close (); + +(* -------------------------------------------------------------------------- *) +(* Interpreter *) + + let print_position outx lexbuf = + let pos = lexbuf.lex_curr_p in + Printf.fprintf outx "Encountered \"%s\" at %s:%d:%d" + (Lexing.lexeme lexbuf) pos.pos_fname + pos.pos_lnum (pos.pos_cnum - pos.pos_bol + 1) + in + + let interpret_file inch (inval: int) outch = + let lexbuf = Lexing.from_channel inch in + let program = + try Parser.prg Lexer.read lexbuf with + | Lexer.LexingError msg -> + Printf.fprintf stderr "%a: %s\n" print_position lexbuf msg; + exit (-1) + | Parser.Error -> Printf.fprintf stderr "%a: syntax error\n" print_position lexbuf; + exit (-1) + in + let _ = + match TypeChecker.typecheck program with + | Ok _ -> () + | Error (`AbsentAssignment msg) + | Error (`WrongTypeSpecification msg) + | Error (`WrongType msg) -> + Printf.fprintf stderr "%s\n" msg; + exit (-1) + in + let return_value = + match Semantics.reduce program inval with + Ok o -> o + | Error (`AbsentAssignment msg) + | Error (`DivisionByZero msg) + | Error (`WrongType msg) -> + Printf.fprintf stderr "%s\n" msg; + exit (-1) + in + + Printf.fprintf outch "%d\n" return_value + in + + + let inx = In_channel.open_text input in + let outx = match output with + None -> stdout + | Some f -> Out_channel.open_text f + in + + let inputval = match inputval with + None -> ( + Printf.fprintf stdout "Provide the input: "; + read_int () + ) + | Some o -> o + in + interpret_file inx inputval outx; diff --git a/bin/miniImpInterpreter.ml b/bin/miniImpInterpreter.ml new file mode 100644 index 0000000..999c858 --- /dev/null +++ b/bin/miniImpInterpreter.ml @@ -0,0 +1,91 @@ +open MiniImp +open Lexing + +(* -------------------------------------------------------------------------- *) +(* Command Arguments *) + +let () = + Clap.description "Interpreter for MiniImp language."; + + let files = Clap.section ~description: "Files to consider." "FILES" in + let values = Clap.section ~description: "Input values." "VALUES" in + + let input = Clap.mandatory_string + ~description: "Input file." + ~placeholder: "FILENAME" + ~section: files + ~long: "input" + ~short: 'i' + () + in + + let inputval = Clap.optional_int + ~description: "Optional input value to feed to the program. \ + If not specified it is read from stdin." + ~placeholder: "INT" + ~section: values + ~long: "value" + ~short: 'v' + () + in + + let output = Clap.optional_string + ~description: "Output file. If not specified output is printed on stdout." + ~placeholder: "FILENAME" + ~section: files + ~long: "output" + ~long_synonyms: ["out"; "result"] + ~short: 'o' + () + in + + Clap.close (); + +(* -------------------------------------------------------------------------- *) +(* Interpreter *) + + let print_position outx lexbuf = + let pos = lexbuf.lex_curr_p in + Printf.fprintf outx "Encountered \"%s\" at %s:%d:%d" + (Lexing.lexeme lexbuf) pos.pos_fname + pos.pos_lnum (pos.pos_cnum - pos.pos_bol + 1) + in + + let interpret_file inch (inval: int) outch = + let lexbuf = Lexing.from_channel inch in + let program = + try Parser.prg Lexer.read lexbuf with + | Lexer.LexingError msg -> + Printf.fprintf stderr "%a: %s\n" print_position lexbuf msg; + exit (-1) + | Parser.Error -> Printf.fprintf stderr "%a: syntax error\n" print_position lexbuf; + exit (-1) + in + let return_value = + match Semantics.reduce program inval with + Ok o -> o + | Error (`AbsentAssignment msg) + | Error (`DivisionByZero msg) + | Error (`WrongType msg) -> + Printf.fprintf stderr "%s\n" msg; + exit (-1) + in + + Printf.fprintf outch "%d\n" return_value + in + + + let inx = In_channel.open_text input in + let outx = match output with + None -> stdout + | Some f -> Out_channel.open_text f + in + + let inputval = match inputval with + None -> ( + Printf.fprintf stdout "Provide the input: "; + read_int () + ) + | Some o -> o + in + interpret_file inx inputval outx; diff --git a/bin/sum.miniimp b/bin/sum.miniimp new file mode 100644 index 0000000..ec74aed --- /dev/null +++ b/bin/sum.miniimp @@ -0,0 +1,8 @@ +def main with input in output out as + x := in; + out := 0; + while not x < 0 do ( + out := out + x; + x := x - 1; + ); + skip diff --git a/lib/miniFun/Semantics.ml b/lib/miniFun/Semantics.ml index cd36897..49640d6 100644 --- a/lib/miniFun/Semantics.ml +++ b/lib/miniFun/Semantics.ml @@ -5,7 +5,7 @@ Random.self_init () let (let*) = Result.bind -let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) result = +let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, [> error]) result = match command with Integer n -> Ok (IntegerPermitted n) | Boolean b -> Ok (BooleanPermitted b) @@ -341,7 +341,7 @@ let rec evaluate (mem: memory) (command: t_exp) : (permittedValues, error) resul evaluate mem2 rest -let reduce (program: t_exp) (iin : int) : (int, error) result = +let reduce (program: t_exp) (iin : int) : (int, [> error]) result = let program' = (Application (program, (Integer iin))) in let mem : memory = {assignments = VariableMap.empty} in match (evaluate mem program') with diff --git a/lib/miniFun/Semantics.mli b/lib/miniFun/Semantics.mli index 1fe6f62..176883e 100644 --- a/lib/miniFun/Semantics.mli +++ b/lib/miniFun/Semantics.mli @@ -1,3 +1,3 @@ -val reduce : Types.t_exp -> int -> (int, Types.error) result +val evaluate : Types.memory -> Types.t_exp -> (Types.permittedValues, [> Types.error]) result -val evaluate : Types.memory -> Types.t_exp -> (Types.permittedValues, Types.error) result +val reduce : Types.t_exp -> int -> (int, [> Types.error]) result diff --git a/lib/miniFun/TypeChecker.ml b/lib/miniFun/TypeChecker.ml index f84ac4f..a19378e 100644 --- a/lib/miniFun/TypeChecker.ml +++ b/lib/miniFun/TypeChecker.ml @@ -5,7 +5,7 @@ Random.self_init () let (let*) = Result.bind -let rec evaluate_type (program: t_exp) (context: ftype VariableMap.t) : (ftype, error) result = +let rec evaluate_type (program: t_exp) (context: ftype VariableMap.t) : (ftype, [> typechecking_error]) result = match program with Integer _ -> Ok IntegerType | Boolean _ -> Ok BooleanType @@ -150,7 +150,7 @@ let rec evaluate_type (program: t_exp) (context: ftype VariableMap.t) : (ftype, | _ -> Error (`WrongTypeSpecification "Specification of function is not a function type.") -let typecheck (program: t_exp) : (ftype, error) result = +let typecheck (program: t_exp) : (ftype, [> typechecking_error]) result = let* typeprogram = evaluate_type program VariableMap.empty in match typeprogram with FunctionType (IntegerType, IntegerType) -> ( diff --git a/lib/miniFun/TypeChecker.mli b/lib/miniFun/TypeChecker.mli index 286691a..bb296d2 100644 --- a/lib/miniFun/TypeChecker.mli +++ b/lib/miniFun/TypeChecker.mli @@ -1 +1 @@ -val typecheck : Types.t_exp -> (Types.ftype, Types.error) result +val typecheck : Types.t_exp -> (Types.ftype, [> Types.typechecking_error]) result diff --git a/lib/miniFun/Types.ml b/lib/miniFun/Types.ml index bc526df..9bfae31 100644 --- a/lib/miniFun/Types.ml +++ b/lib/miniFun/Types.ml @@ -53,9 +53,18 @@ type memory = { assignments: permittedValues VariableMap.t } -type error = [ + +type base_error = [ `AbsentAssignment of string | `WrongType of string - | `DivisionByZero of string +] + +type typechecking_error = [ + | base_error | `WrongTypeSpecification of string ] + +type error = [ + | base_error + | `DivisionByZero of string +] diff --git a/lib/miniFun/Types.mli b/lib/miniFun/Types.mli index 74bd6ba..ca38091 100644 --- a/lib/miniFun/Types.mli +++ b/lib/miniFun/Types.mli @@ -53,9 +53,18 @@ type memory = { assignments: permittedValues VariableMap.t } -type error = [ + +type base_error = [ `AbsentAssignment of string | `WrongType of string - | `DivisionByZero of string +] + +type typechecking_error = [ + | base_error | `WrongTypeSpecification of string ] + +type error = [ + | base_error + | `DivisionByZero of string +] diff --git a/lib/miniFun/dune b/lib/miniFun/dune index 2b0876b..3547f71 100644 --- a/lib/miniFun/dune +++ b/lib/miniFun/dune @@ -13,4 +13,4 @@ (modules Lexer Parser Types Semantics TypeChecker) (libraries utility menhirLib)) -(include_subdirs qualified) \ No newline at end of file +(include_subdirs qualified) diff --git a/lib/miniImp/Lexer.mll b/lib/miniImp/Lexer.mll index bf4e94e..89508a5 100644 --- a/lib/miniImp/Lexer.mll +++ b/lib/miniImp/Lexer.mll @@ -9,18 +9,24 @@ let keyword_table = let mapping = [ - ("main", MAIN); - ("skip", SKIP); - ("if", IF); - ("else", ELSE); - ("while", WHILE); - ("for", FOR); + ("as", AS); + ("def", DEF); ("do", DO); - ("true", BOOL(true)); + ("else", ELSE); ("false", BOOL(false)); + ("for", FOR); + ("if", IF); + ("input", INPUT); + ("main", MAIN); ("not", BNOT); - ("rand", RAND); + ("output", OUTPUT); ("powmod", POWERMOD); + ("rand", RAND); + ("skip", SKIP); + ("then", THEN); + ("true", BOOL(true)); + ("while", WHILE); + ("with", WITH); ] in create_hashtable (List.length mapping) mapping } @@ -42,26 +48,24 @@ rule read = parse | Some keyword -> keyword | None -> VARIABLE(v) } - | ";" {SEQUENCE} - | "," {COMMA} - | "{" {LEFTGPAR} - | "}" {RIGHTGPAR} + | "%" {MODULO} + | "&&" {BAND} | "(" {LEFTPAR} | ")" {RIGHTPAR} - | "<" {BCMPLESS} - | ">" {BCMPGREATER} - | "+" {PLUS} - | "-" {MINUS} | "*" {TIMES} + | "+" {PLUS} + | "," {COMMA} + | "-" {MINUS} | "/" {DIVISION} - | "%" {MODULO} - | "^" {POWER} | ":=" {ASSIGNMENT} - | "&&" {BAND} - | "||" {BOR} - | "==" {BCMP} + | ";" {SEQUENCE} + | "<" {BCMPLESS} | "<=" {BCMPLESSEQ} + | "==" {BCMP} + | ">" {BCMPGREATER} | ">=" {BCMPGREATEREQ} + | "^" {POWER} + | "||" {BOR} | integer as i {INT(int_of_string i)} | "(*" {comments 0 lexbuf} | eof {EOF} diff --git a/lib/miniImp/Parser.messages b/lib/miniImp/Parser.messages deleted file mode 100644 index 7eba78f..0000000 --- a/lib/miniImp/Parser.messages +++ /dev/null @@ -1,1016 +0,0 @@ -prg: WHILE -## -## Ends in an error in state: 0. -## -## prg' -> . prg [ # ] -## -## The known suffix of the stack is as follows: -## -## - -Program must begin with "main var var {...}". - -prg: MAIN WHILE -## -## Ends in an error in state: 1. -## -## prg -> MAIN . VARIABLE VARIABLE LEFTGPAR cexpp RIGHTGPAR EOF [ # ] -## -## The known suffix of the stack is as follows: -## MAIN -## - -Program must begin with "main var var {...}". - -prg: MAIN VARIABLE WHILE -## -## Ends in an error in state: 2. -## -## prg -> MAIN VARIABLE . VARIABLE LEFTGPAR cexpp RIGHTGPAR EOF [ # ] -## -## The known suffix of the stack is as follows: -## MAIN VARIABLE -## - -Program must begin with "main var var {...}". - -prg: MAIN VARIABLE VARIABLE WHILE -## -## Ends in an error in state: 3. -## -## prg -> MAIN VARIABLE VARIABLE . LEFTGPAR cexpp RIGHTGPAR EOF [ # ] -## -## The known suffix of the stack is as follows: -## MAIN VARIABLE VARIABLE -## - -Program must begin with "main var var {...}". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR TIMES -## -## Ends in an error in state: 4. -## -## prg -> MAIN VARIABLE VARIABLE LEFTGPAR . cexpp RIGHTGPAR EOF [ # ] -## -## The known suffix of the stack is as follows: -## MAIN VARIABLE VARIABLE LEFTGPAR -## - -No left value for "*". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE WHILE -## -## Ends in an error in state: 5. -## -## cexpp -> WHILE . bexpp DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## WHILE -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE RAND WHILE -## -## Ends in an error in state: 7. -## -## aexpp -> RAND . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## RAND -## - -Error while parsing "rand" - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD WHILE -## -## Ends in an error in state: 8. -## -## aexpp -> POWERMOD . LEFTPAR aexpp COMMA aexpp COMMA aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD -## - -Error while parsing "powmod". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD LEFTPAR WHILE -## -## Ends in an error in state: 9. -## -## aexpp -> POWERMOD LEFTPAR . aexpp COMMA aexpp COMMA aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD LEFTPAR -## - -Error while parsing "powmod", first element is not an arithmetic expression. - -prg: MAIN VARIABLE VARIABLE LEFTGPAR VARIABLE ASSIGNMENT LEFTPAR WHILE -## -## Ends in an error in state: 10. -## -## aexpp -> LEFTPAR . aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## LEFTPAR -## - -Assignment of a value that is not arithmetic. - -prg: MAIN VARIABLE VARIABLE LEFTGPAR VARIABLE ASSIGNMENT LEFTPAR INT SEQUENCE -## -## Ends in an error in state: 12. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> LEFTPAR aexpp . RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## LEFTPAR aexpp -## - -Error while parsing ";". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT TIMES WHILE -## -## Ends in an error in state: 13. -## -## aexpp -> aexpp TIMES . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp TIMES -## - -Error while parsing "*", second argument is not arithmetic. - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT TIMES INT WHILE -## -## Ends in an error in state: 14. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp TIMES aexpp . [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp TIMES aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT POWER WHILE -## -## Ends in an error in state: 15. -## -## aexpp -> aexpp POWER . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp POWER -## - -Error while parsing "^". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT PLUS WHILE -## -## Ends in an error in state: 18. -## -## aexpp -> aexpp PLUS . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp PLUS -## - -Error while parsing "+". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT PLUS INT WHILE -## -## Ends in an error in state: 19. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp PLUS aexpp . [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp PLUS aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT MODULO WHILE -## -## Ends in an error in state: 20. -## -## aexpp -> aexpp MODULO . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp MODULO -## - -Error while parsing "%". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT MODULO INT WHILE -## -## Ends in an error in state: 21. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp MODULO aexpp . [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp MODULO aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT DIVISION WHILE -## -## Ends in an error in state: 22. -## -## aexpp -> aexpp DIVISION . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp DIVISION -## - -Error while parsing "/". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT DIVISION INT WHILE -## -## Ends in an error in state: 23. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp DIVISION aexpp . [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp DIVISION aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT MINUS WHILE -## -## Ends in an error in state: 24. -## -## aexpp -> aexpp MINUS . aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp MINUS -## - -Error while parsing "-". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT MINUS INT WHILE -## -## Ends in an error in state: 25. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp MINUS aexpp . [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## aexpp MINUS aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD LEFTPAR INT SEQUENCE -## -## Ends in an error in state: 26. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . MINUS aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . TIMES aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . MODULO aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . POWER aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> POWERMOD LEFTPAR aexpp . COMMA aexpp COMMA aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD LEFTPAR aexpp -## - -Error while parsing "powmod". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD LEFTPAR INT COMMA WHILE -## -## Ends in an error in state: 27. -## -## aexpp -> POWERMOD LEFTPAR aexpp COMMA . aexpp COMMA aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD LEFTPAR aexpp COMMA -## - -Error while parsing "powmod". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD LEFTPAR INT COMMA INT SEQUENCE -## -## Ends in an error in state: 28. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . MINUS aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . TIMES aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . MODULO aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> aexpp . POWER aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION COMMA ] -## aexpp -> POWERMOD LEFTPAR aexpp COMMA aexpp . COMMA aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD LEFTPAR aexpp COMMA aexpp -## - -Error while parsing "powmod". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD LEFTPAR INT COMMA INT COMMA WHILE -## -## Ends in an error in state: 29. -## -## aexpp -> POWERMOD LEFTPAR aexpp COMMA aexpp COMMA . aexpp RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD LEFTPAR aexpp COMMA aexpp COMMA -## - -Error while parsing "powmod". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE POWERMOD LEFTPAR INT COMMA INT COMMA INT SEQUENCE -## -## Ends in an error in state: 30. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION ] -## aexpp -> POWERMOD LEFTPAR aexpp COMMA aexpp COMMA aexpp . RIGHTPAR [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DO DIVISION COMMA BOR BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP BAND ] -## -## The known suffix of the stack is as follows: -## POWERMOD LEFTPAR aexpp COMMA aexpp COMMA aexpp -## - -Error while parsing "powmod". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE LEFTPAR WHILE -## -## Ends in an error in state: 33. -## -## aexpp -> LEFTPAR . aexpp RIGHTPAR [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## bexpp -> LEFTPAR . bexpp RIGHTPAR [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## LEFTPAR -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BNOT WHILE -## -## Ends in an error in state: 35. -## -## bexpp -> BNOT . bexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## BNOT -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT SEQUENCE -## -## Ends in an error in state: 37. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . MINUS aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . TIMES aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . MODULO aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . POWER aexpp [ TIMES POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## bexpp -> aexpp . BCMP aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## bexpp -> aexpp . BCMPLESS aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## bexpp -> aexpp . BCMPLESSEQ aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## bexpp -> aexpp . BCMPGREATER aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## bexpp -> aexpp . BCMPGREATEREQ aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPLESSEQ WHILE -## -## Ends in an error in state: 38. -## -## bexpp -> aexpp BCMPLESSEQ . aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPLESSEQ -## - -Error while parsing "<=" - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPLESSEQ INT SEQUENCE -## -## Ends in an error in state: 39. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## bexpp -> aexpp BCMPLESSEQ aexpp . [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPLESSEQ aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPLESS WHILE -## -## Ends in an error in state: 40. -## -## bexpp -> aexpp BCMPLESS . aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPLESS -## - -Error while parsing "<". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPLESS INT SEQUENCE -## -## Ends in an error in state: 41. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## bexpp -> aexpp BCMPLESS aexpp . [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPLESS aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPGREATEREQ WHILE -## -## Ends in an error in state: 42. -## -## bexpp -> aexpp BCMPGREATEREQ . aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPGREATEREQ -## - -Error while parsing ">=". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPGREATEREQ INT SEQUENCE -## -## Ends in an error in state: 43. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## bexpp -> aexpp BCMPGREATEREQ aexpp . [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPGREATEREQ aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPGREATER WHILE -## -## Ends in an error in state: 44. -## -## bexpp -> aexpp BCMPGREATER . aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPGREATER -## - -Error while parsing ">". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMPGREATER INT SEQUENCE -## -## Ends in an error in state: 45. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## bexpp -> aexpp BCMPGREATER aexpp . [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMPGREATER aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMP WHILE -## -## Ends in an error in state: 46. -## -## bexpp -> aexpp BCMP . aexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMP -## - -Error while parsing "==". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE INT BCMP INT SEQUENCE -## -## Ends in an error in state: 47. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DO DIVISION COMMA BOR BAND ] -## bexpp -> aexpp BCMP aexpp . [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## aexpp BCMP aexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE LEFTPAR BOOL WHILE -## -## Ends in an error in state: 48. -## -## bexpp -> bexpp . BAND bexpp [ RIGHTPAR BOR BAND ] -## bexpp -> bexpp . BOR bexpp [ RIGHTPAR BOR BAND ] -## bexpp -> LEFTPAR bexpp . RIGHTPAR [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## LEFTPAR bexpp -## - -Error while parsing "while". - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BOOL BOR WHILE -## -## Ends in an error in state: 50. -## -## bexpp -> bexpp BOR . bexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## bexpp BOR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BOOL BAND WHILE -## -## Ends in an error in state: 52. -## -## bexpp -> bexpp BAND . bexpp [ RIGHTPAR DO COMMA BOR BAND ] -## -## The known suffix of the stack is as follows: -## bexpp BAND -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE LEFTPAR INT SEQUENCE -## -## Ends in an error in state: 54. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . MINUS aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . TIMES aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . MODULO aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> aexpp . POWER aexpp [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## aexpp -> LEFTPAR aexpp . RIGHTPAR [ TIMES RIGHTPAR POWER PLUS MODULO MINUS DIVISION BCMPLESSEQ BCMPLESS BCMPGREATEREQ BCMPGREATER BCMP ] -## bexpp -> aexpp . BCMP aexpp [ RIGHTPAR BOR BAND ] -## bexpp -> aexpp . BCMPLESS aexpp [ RIGHTPAR BOR BAND ] -## bexpp -> aexpp . BCMPLESSEQ aexpp [ RIGHTPAR BOR BAND ] -## bexpp -> aexpp . BCMPGREATER aexpp [ RIGHTPAR BOR BAND ] -## bexpp -> aexpp . BCMPGREATEREQ aexpp [ RIGHTPAR BOR BAND ] -## -## The known suffix of the stack is as follows: -## LEFTPAR aexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BOOL WHILE -## -## Ends in an error in state: 55. -## -## bexpp -> bexpp . BAND bexpp [ DO BOR BAND ] -## bexpp -> bexpp . BOR bexpp [ DO BOR BAND ] -## cexpp -> WHILE bexpp . DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## WHILE bexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BOOL DO WHILE -## -## Ends in an error in state: 56. -## -## cexpp -> WHILE bexpp DO . LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## WHILE bexpp DO -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BOOL DO LEFTGPAR TIMES -## -## Ends in an error in state: 57. -## -## cexpp -> WHILE bexpp DO LEFTGPAR . cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## WHILE bexpp DO LEFTGPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR VARIABLE WHILE -## -## Ends in an error in state: 58. -## -## cexpp -> VARIABLE . ASSIGNMENT aexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## VARIABLE -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR VARIABLE ASSIGNMENT WHILE -## -## Ends in an error in state: 59. -## -## cexpp -> VARIABLE ASSIGNMENT . aexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## VARIABLE ASSIGNMENT -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR VARIABLE ASSIGNMENT INT DO -## -## Ends in an error in state: 60. -## -## aexpp -> aexpp . PLUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DIVISION COMMA ] -## aexpp -> aexpp . MINUS aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DIVISION COMMA ] -## aexpp -> aexpp . TIMES aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DIVISION COMMA ] -## aexpp -> aexpp . DIVISION aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DIVISION COMMA ] -## aexpp -> aexpp . MODULO aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DIVISION COMMA ] -## aexpp -> aexpp . POWER aexpp [ TIMES SEQUENCE RIGHTPAR RIGHTGPAR POWER PLUS MODULO MINUS ELSE DIVISION COMMA ] -## cexpp -> VARIABLE ASSIGNMENT aexpp . [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## VARIABLE ASSIGNMENT aexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR LEFTGPAR TIMES -## -## Ends in an error in state: 62. -## -## cexpp -> LEFTGPAR . cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## LEFTGPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR IF WHILE -## -## Ends in an error in state: 63. -## -## cexpp -> IF . LEFTPAR bexpp RIGHTPAR cexpp ELSE cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## IF -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR IF LEFTPAR WHILE -## -## Ends in an error in state: 64. -## -## cexpp -> IF LEFTPAR . bexpp RIGHTPAR cexpp ELSE cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## IF LEFTPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR IF LEFTPAR BOOL WHILE -## -## Ends in an error in state: 65. -## -## bexpp -> bexpp . BAND bexpp [ RIGHTPAR BOR BAND ] -## bexpp -> bexpp . BOR bexpp [ RIGHTPAR BOR BAND ] -## cexpp -> IF LEFTPAR bexpp . RIGHTPAR cexpp ELSE cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## IF LEFTPAR bexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR IF LEFTPAR BOOL RIGHTPAR TIMES -## -## Ends in an error in state: 66. -## -## cexpp -> IF LEFTPAR bexpp RIGHTPAR . cexpp ELSE cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## IF LEFTPAR bexpp RIGHTPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR WHILE -## -## Ends in an error in state: 67. -## -## cexpp -> FOR . LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR TIMES -## -## Ends in an error in state: 68. -## -## cexpp -> FOR LEFTPAR . cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP WHILE -## -## Ends in an error in state: 69. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE COMMA ] -## cexpp -> FOR LEFTPAR cexpp . COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR SKIP SEQUENCE TIMES -## -## Ends in an error in state: 70. -## -## cexpp -> cexpp SEQUENCE . cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## cexpp SEQUENCE -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR SKIP SEQUENCE SKIP WHILE -## -## Ends in an error in state: 71. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## cexpp -> cexpp SEQUENCE cexpp . [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## cexpp SEQUENCE cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA WHILE -## -## Ends in an error in state: 72. -## -## cexpp -> FOR LEFTPAR cexpp COMMA . bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL WHILE -## -## Ends in an error in state: 73. -## -## bexpp -> bexpp . BAND bexpp [ COMMA BOR BAND ] -## bexpp -> bexpp . BOR bexpp [ COMMA BOR BAND ] -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp . COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL COMMA TIMES -## -## Ends in an error in state: 74. -## -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp COMMA . cexpp RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp COMMA -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL COMMA SKIP WHILE -## -## Ends in an error in state: 75. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE RIGHTPAR ] -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp . RIGHTPAR DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL COMMA SKIP RIGHTPAR WHILE -## -## Ends in an error in state: 76. -## -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR . DO LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL COMMA SKIP RIGHTPAR DO WHILE -## -## Ends in an error in state: 77. -## -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO . LEFTGPAR cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL COMMA SKIP RIGHTPAR DO LEFTGPAR TIMES -## -## Ends in an error in state: 78. -## -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR . cexpp RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR FOR LEFTPAR SKIP COMMA BOOL COMMA SKIP RIGHTPAR DO LEFTGPAR SKIP WHILE -## -## Ends in an error in state: 79. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE RIGHTGPAR ] -## cexpp -> FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp . RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## FOR LEFTPAR cexpp COMMA bexpp COMMA cexpp RIGHTPAR DO LEFTGPAR cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR IF LEFTPAR BOOL RIGHTPAR SKIP WHILE -## -## Ends in an error in state: 81. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE ELSE ] -## cexpp -> IF LEFTPAR bexpp RIGHTPAR cexpp . ELSE cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## IF LEFTPAR bexpp RIGHTPAR cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR IF LEFTPAR BOOL RIGHTPAR SKIP ELSE TIMES -## -## Ends in an error in state: 82. -## -## cexpp -> IF LEFTPAR bexpp RIGHTPAR cexpp ELSE . cexpp [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## IF LEFTPAR bexpp RIGHTPAR cexpp ELSE -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR LEFTGPAR SKIP WHILE -## -## Ends in an error in state: 84. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE RIGHTGPAR ] -## cexpp -> LEFTGPAR cexpp . RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## LEFTGPAR cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR WHILE BOOL DO LEFTGPAR SKIP WHILE -## -## Ends in an error in state: 86. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE RIGHTGPAR ] -## cexpp -> WHILE bexpp DO LEFTGPAR cexpp . RIGHTGPAR [ SEQUENCE RIGHTPAR RIGHTGPAR ELSE COMMA ] -## -## The known suffix of the stack is as follows: -## WHILE bexpp DO LEFTGPAR cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR SKIP WHILE -## -## Ends in an error in state: 88. -## -## cexpp -> cexpp . SEQUENCE cexpp [ SEQUENCE RIGHTGPAR ] -## prg -> MAIN VARIABLE VARIABLE LEFTGPAR cexpp . RIGHTGPAR EOF [ # ] -## -## The known suffix of the stack is as follows: -## MAIN VARIABLE VARIABLE LEFTGPAR cexpp -## - - - -prg: MAIN VARIABLE VARIABLE LEFTGPAR SKIP RIGHTGPAR WHILE -## -## Ends in an error in state: 89. -## -## prg -> MAIN VARIABLE VARIABLE LEFTGPAR cexpp RIGHTGPAR . EOF [ # ] -## -## The known suffix of the stack is as follows: -## MAIN VARIABLE VARIABLE LEFTGPAR cexpp RIGHTGPAR -## - - - diff --git a/lib/miniImp/Parser.mly b/lib/miniImp/Parser.mly index 3962274..e52eb52 100644 --- a/lib/miniImp/Parser.mly +++ b/lib/miniImp/Parser.mly @@ -6,14 +6,13 @@ %} (* tokens *) -%token MAIN SKIP ASSIGNMENT SEQUENCE IF ELSE WHILE FOR DO COMMA -%token LEFTGPAR RIGHTGPAR -%token BOOL -%token BAND BOR BNOT BCMP BCMPLESS BCMPLESSEQ BCMPGREATER BCMPGREATEREQ -%token VARIABLE -%token INT -%token LEFTPAR RIGHTPAR +%token MAIN DEF WITH INPUT OUTPUT AS SKIP ASSIGNMENT SEQUENCE IF THEN ELSE WHILE +%token FOR DO COMMA LEFTPAR RIGHTPAR %token PLUS MINUS TIMES DIVISION MODULO POWER POWERMOD RAND +%token BAND BOR BNOT BCMP BCMPLESS BCMPLESSEQ BCMPGREATER BCMPGREATEREQ +%token BOOL +%token INT +%token VARIABLE %token EOF %type cexpp @@ -25,7 +24,7 @@ %start prg (* associativity in order of precedence *) -%left twoseq +%left lowest %left SEQUENCE %left ELSE %left PLUS MINUS BOR BAND @@ -34,52 +33,53 @@ %left MODULO %left TIMES %left POWER +%left DO %% (* grammar *) prg: - | MAIN; a = VARIABLE; b = VARIABLE; LEFTGPAR; t = cexpp; RIGHTGPAR; EOF - {Main (a, b, t)} // main a b {...} + | DEF; MAIN; WITH; INPUT; a = VARIABLE; OUTPUT; b = VARIABLE; AS; t = cexpp; EOF + {Main (a, b, t)} // def main with input a output b as t cexpp: | SKIP {Skip} // skip | a = VARIABLE; ASSIGNMENT; body = aexpp - {Assignment (a, body)} // a := ... - | t1 = cexpp; SEQUENCE; t2 = cexpp %prec twoseq - {Sequence (t1, t2)} // ...; ... - | t = cexpp; SEQUENCE {t} // ...; - | IF; LEFTPAR; guard = bexpp; RIGHTPAR; body1 = cexpp; ELSE; body2 = cexpp - {If (guard, body1, body2)} // if (...) ... else ... - | WHILE; guard = bexpp; DO; LEFTGPAR; body = cexpp; RIGHTGPAR - {While (guard, body)} // while ... do {...} + {Assignment (a, body)} // a := body + | t1 = cexpp; SEQUENCE; t2 = cexpp %prec lowest + {Sequence (t1, t2)} // t1; t2 + | t = cexpp; SEQUENCE {t} // t; + | IF; guard = bexpp; THEN; body1 = cexpp; ELSE; body2 = cexpp + {If (guard, body1, body2)} // if ... then ... else ... + | WHILE; guard = bexpp; DO; body = cexpp; + {While (guard, body)} // while ... do ... | FOR; LEFTPAR; ass = cexpp; COMMA; guard = bexpp; COMMA; iter = cexpp; RIGHTPAR; - DO; LEFTGPAR; body = cexpp; RIGHTGPAR - {For (ass, guard, iter, body)} // for (..., ..., ...) do {...} - | LEFTGPAR; t = cexpp; RIGHTGPAR {t} // {...} + DO; body = cexpp; + {For (ass, guard, iter, body)} // for (..., ..., ...) do ... + | LEFTPAR; t = cexpp; RIGHTPAR {t} // (...) bexpp: - | b = BOOL {Boolean (b)} - | b1 = bexpp; BAND; b2 = bexpp {BAnd (b1, b2)} - | b1 = bexpp; BOR; b2 = bexpp {BOr (b1, b2)} - | BNOT; b = bexpp {BNot (b)} - | a1 = aexpp; BCMP; a2 = aexpp {BCmp (a1, a2)} - | a1 = aexpp; BCMPLESS; a2 = aexpp {BCmpLess (a1, a2)} - | a1 = aexpp; BCMPLESSEQ; a2 = aexpp {BCmpLessEq (a1, a2)} - | a1 = aexpp; BCMPGREATER; a2 = aexpp {BCmpGreater (a1, a2)} - | a1 = aexpp; BCMPGREATEREQ; a2 = aexpp {BCmpGreaterEq (a1, a2)} - | LEFTPAR; b = bexpp; RIGHTPAR {b} + | b = BOOL {Boolean (b)} // true, false + | b1 = bexpp; BAND; b2 = bexpp {BAnd (b1, b2)} // && + | b1 = bexpp; BOR; b2 = bexpp {BOr (b1, b2)} // || + | BNOT; b = bexpp {BNot (b)} // not + | a1 = aexpp; BCMP; a2 = aexpp {BCmp (a1, a2)} // == + | a1 = aexpp; BCMPLESS; a2 = aexpp {BCmpLess (a1, a2)} // < + | a1 = aexpp; BCMPLESSEQ; a2 = aexpp {BCmpLessEq (a1, a2)} // <= + | a1 = aexpp; BCMPGREATER; a2 = aexpp {BCmpGreater (a1, a2)} // > + | a1 = aexpp; BCMPGREATEREQ; a2 = aexpp {BCmpGreaterEq (a1, a2)} // >= + | LEFTPAR; b = bexpp; RIGHTPAR {b} // (b) aexpp: | a = VARIABLE {Variable (a)} | i = INT {Integer (i)} - | t1 = aexpp; PLUS; t2 = aexpp {Plus (t1, t2)} - | t1 = aexpp; MINUS; t2 = aexpp {Minus (t1, t2)} + | t1 = aexpp; PLUS; t2 = aexpp {Plus (t1, t2)} // + + | t1 = aexpp; MINUS; t2 = aexpp {Minus (t1, t2)} // - | MINUS; i = INT {Integer (-i)} - | t1 = aexpp; TIMES; t2 = aexpp {Times (t1, t2)} - | t1 = aexpp; DIVISION; t2 = aexpp {Division (t1, t2)} - | t1 = aexpp; MODULO; t2 = aexpp {Modulo (t1, t2)} - | t1 = aexpp; POWER; t2 = aexpp {Power (t1, t2)} + | t1 = aexpp; TIMES; t2 = aexpp {Times (t1, t2)} // * + | t1 = aexpp; DIVISION; t2 = aexpp {Division (t1, t2)} // / + | t1 = aexpp; MODULO; t2 = aexpp {Modulo (t1, t2)} // % + | t1 = aexpp; POWER; t2 = aexpp {Power (t1, t2)} // ^ | POWERMOD; LEFTPAR; t1 = aexpp; COMMA; t2 = aexpp; COMMA; t3 = aexpp; RIGHTPAR - {PowerMod (t1, t2, t3)} // powmod (..., ..., ...) - | RAND; LEFTPAR; t = aexpp; RIGHTPAR {Rand (t)} - | LEFTPAR; a = aexpp; RIGHTPAR {a} + {PowerMod (t1, t2, t3)} // powmod(..., ..., ...) + | RAND; LEFTPAR; t = aexpp; RIGHTPAR {Rand (t)} // rand() + | LEFTPAR; a = aexpp; RIGHTPAR {a} // (a) diff --git a/lib/miniImp/Semantics.ml b/lib/miniImp/Semantics.ml index 1505899..b783715 100644 --- a/lib/miniImp/Semantics.ml +++ b/lib/miniImp/Semantics.ml @@ -4,139 +4,153 @@ module Utility = Utility;; Random.self_init () -let rec evaluate (mem: memory) (command: c_exp) = +let (let*) = Result.bind + +let rec evaluate (mem: memory) (command: c_exp) : (memory, [> error]) result = match command with - Skip -> mem - | Assignment (v, exp_a) -> { - (* Map.add replaces the previeus value *) - assignments = VariableMap.add v (evaluate_a mem exp_a) mem.assignments + Skip -> Ok mem + | Assignment (v, exp_a) -> + let* vval = evaluate_a mem exp_a in + Ok { + (* Map.add replaces the previus value *) + assignments = VariableMap.add v vval mem.assignments } | Sequence (exp_c1, exp_c2) -> ( - let mem2 = evaluate mem exp_c1 in + let* mem2 = evaluate mem exp_c1 in evaluate mem2 exp_c2 ) | If (exp_b, exp_c1, exp_c2) -> ( - if evaluate_b mem exp_b then + let* guard = evaluate_b mem exp_b in + if guard then evaluate mem exp_c1 else evaluate mem exp_c2 ) | While (exp_b, exp_c) -> ( - if evaluate_b mem exp_b then - let mem2 = evaluate mem exp_c in + let* guard = evaluate_b mem exp_b in + if guard then + let* mem2 = evaluate mem exp_c in evaluate mem2 command else - mem + Ok mem ) | For (exp_c1, exp_b, exp_c2, body_c) -> ( - let mem2 = evaluate mem exp_c1 in - let rec f localmem = - if (evaluate_b localmem exp_b) - then f ( - let tmpmem = (evaluate localmem body_c) in - (evaluate tmpmem exp_c2)) - else localmem + let* mem2 = evaluate mem exp_c1 in + let rec f (localmem: memory) : (memory, [> error]) result = + let* guard = (evaluate_b localmem exp_b) in + if guard + then + let* stepmem = evaluate localmem body_c in + let* incrementmem = evaluate stepmem exp_c2 in + f incrementmem + else Ok localmem in f mem2 ) -and evaluate_a (mem: memory) (exp_a: a_exp) = + +and evaluate_a (mem: memory) (exp_a: a_exp) : (int, [> error]) result = match exp_a with Variable v -> ( match VariableMap.find_opt v mem.assignments with - None -> raise (AbsentAssignment ("The variable " ^ v ^ " is not defined.")) - | Some a -> a + None -> Error (`AbsentAssignment ("The variable " ^ v ^ " is not defined.")) + | Some a -> Ok a ) - | Integer n -> n + | Integer n -> Ok n | Plus (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val + exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val + exp_a2val) ) | Minus (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val - exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val - exp_a2val) ) | Times (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val * exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val * exp_a2val) ) | Division (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in try - exp_a1val / exp_a2val - with Division_by_zero -> raise (DivisionByZero "Dividing by zero") + Ok (exp_a1val / exp_a2val) + with Division_by_zero -> Error (`DivisionByZero "Dividing by zero") ) | Modulo (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val mod exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val mod exp_a2val) ) | Power (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - Utility.pow exp_a1val exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (Utility.pow exp_a1val exp_a2val) ) | PowerMod (exp_a1, exp_a2, exp_a3) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - let exp_a3val = evaluate_a mem exp_a3 in - Utility.powmod exp_a1val exp_a3val exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + let* exp_a3val = evaluate_a mem exp_a3 in + Ok (Utility.powmod exp_a1val exp_a3val exp_a2val) ) | Rand (exp_a) -> ( - Random.int (evaluate_a mem exp_a) + let* exp_aval = evaluate_a mem exp_a in + Ok (Random.int exp_aval) ) -and evaluate_b (mem: memory) (exp_b: b_exp) = + + +and evaluate_b (mem: memory) (exp_b: b_exp) : (bool, [> error]) result = match exp_b with - Boolean b -> b + Boolean b -> Ok b | BAnd (exp_b1, exp_b2) -> ( - let exp_b1val = evaluate_b mem exp_b1 in - let exp_b2val = evaluate_b mem exp_b2 in - exp_b1val && exp_b2val + let* exp_b1val = evaluate_b mem exp_b1 in + let* exp_b2val = evaluate_b mem exp_b2 in + Ok (exp_b1val && exp_b2val) ) | BOr (exp_b1, exp_b2) -> ( - let exp_b1val = evaluate_b mem exp_b1 in - let exp_b2val = evaluate_b mem exp_b2 in - exp_b1val || exp_b2val + let* exp_b1val = evaluate_b mem exp_b1 in + let* exp_b2val = evaluate_b mem exp_b2 in + Ok (exp_b1val || exp_b2val) ) | BNot (exp_b) -> ( - not (evaluate_b mem exp_b) + let* exp_bval = evaluate_b mem exp_b in + Ok (not exp_bval) ) | BCmp (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val = exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val = exp_a2val) ) | BCmpLess (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val < exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val < exp_a2val) ) | BCmpLessEq (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val <= exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val <= exp_a2val) ) | BCmpGreater (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val > exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val > exp_a2val) ) | BCmpGreaterEq (exp_a1, exp_a2) -> ( - let exp_a1val = evaluate_a mem exp_a1 in - let exp_a2val = evaluate_a mem exp_a2 in - exp_a1val >= exp_a2val + let* exp_a1val = evaluate_a mem exp_a1 in + let* exp_a2val = evaluate_a mem exp_a2 in + Ok (exp_a1val >= exp_a2val) ) -let reduce (program: p_exp) (iin : int) = +let reduce (program: p_exp) (iin : int) : (int, [> error]) result = match program with Main (vin, vout, expression) -> ( let mem : memory = {assignments = (VariableMap.empty |> VariableMap.add vin iin)} in - match VariableMap.find_opt vout (evaluate mem expression).assignments with - None -> raise (AbsentAssignment ("The output variable is not defined (" ^ vout ^ ")")) - | Some a -> a + let* resultmem : memory = evaluate mem expression in + match VariableMap.find_opt vout resultmem.assignments with + None -> Error (`AbsentAssignment ("The output variable is not defined (" ^ vout ^ ")")) + | Some a -> Ok a ) diff --git a/lib/miniImp/Semantics.mli b/lib/miniImp/Semantics.mli index ac04fd0..b488ded 100644 --- a/lib/miniImp/Semantics.mli +++ b/lib/miniImp/Semantics.mli @@ -1,3 +1,3 @@ open Types -val reduce : p_exp -> int -> int +val reduce : p_exp -> int -> (int, [> Types.error]) result diff --git a/lib/miniImp/Types.ml b/lib/miniImp/Types.ml index 69a41da..db449d1 100644 --- a/lib/miniImp/Types.ml +++ b/lib/miniImp/Types.ml @@ -38,5 +38,7 @@ type memory = { assignments: int VariableMap.t } -exception AbsentAssignment of string -exception DivisionByZero of string +type error = [ + `AbsentAssignment of string + | `DivisionByZero of string +] diff --git a/lib/miniImp/Types.mli b/lib/miniImp/Types.mli index cbcd563..92a9a35 100644 --- a/lib/miniImp/Types.mli +++ b/lib/miniImp/Types.mli @@ -38,5 +38,7 @@ type memory = { assignments: int VariableMap.t } -exception AbsentAssignment of string -exception DivisionByZero of string +type error = [ + `AbsentAssignment of string + | `DivisionByZero of string +] diff --git a/test/testingImp.expected b/test/testingImp.expected index 28a758d..bd227e4 100644 --- a/test/testingImp.expected +++ b/test/testingImp.expected @@ -5,5 +5,5 @@ Hailstone sequence's lenght program: 351 Sum multiples of 3 and 5 program: 35565945 Rand program: true Fibonacci program: 4807526976 -Miller-Rabin primality test program: 0 -Miller-Rabin primality test program: 1 +Miller-Rabin primality test program 1: 0 +Miller-Rabin primality test program 2: 1 diff --git a/test/testingImp.ml b/test/testingImp.ml index c5785f3..d4fcdd5 100644 --- a/test/testingImp.ml +++ b/test/testingImp.ml @@ -11,7 +11,12 @@ let program = ) ;; -Printf.printf "Identity program: %d\n" (reduce program 1) +Printf.printf "Identity program: "; +match reduce program 1 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg +;; (* -------------------------------------------------------------------------- *) (* y not defined program *) @@ -28,10 +33,12 @@ let program = ) ;; -try - Printf.printf "y not defined program: %d\n" (reduce program 100) -with AbsentAssignment s -> - Printf.printf "y not defined program: %s\n" s + +Printf.printf "y not defined program: "; +match reduce program 100 with + Ok d -> Printf.printf "error: %d\n" d +| Error `AbsentAssignment msg -> Printf.printf "%s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) @@ -54,9 +61,14 @@ let program = ) ;; -Printf.printf "Factorial program: %d\n" (reduce program 10) +Printf.printf "Factorial program: "; +match reduce program 10 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; + (* -------------------------------------------------------------------------- *) (* Hailstone sequence's lenght program *) let program = @@ -80,7 +92,11 @@ let program = ) ;; -Printf.printf "Hailstone sequence's lenght program: %d\n" (reduce program 77031) +Printf.printf "Hailstone sequence's lenght program: "; +match reduce program 77031 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) @@ -106,7 +122,11 @@ let program = ) ;; -Printf.printf "Sum multiples of 3 and 5 program: %d\n" (reduce program 12345) +Printf.printf "Sum multiples of 3 and 5 program: "; +match reduce program 12345 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) @@ -119,7 +139,11 @@ let program = ) ;; -Printf.printf "Rand program: %b\n" ((reduce program 10) < 10) +Printf.printf "Rand program: "; +match reduce program 10 with + Ok d -> Printf.printf "%b\n" (d < 10) +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) @@ -149,7 +173,11 @@ let program = ) ;; -Printf.printf "Fibonacci program: %d\n" (reduce program 48) +Printf.printf "Fibonacci program: "; +match reduce program 48 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) @@ -216,8 +244,16 @@ let program = ;; (* should return 0 because prime *) -Printf.printf "Miller-Rabin primality test program: %d\n" (reduce program 179424673) +Printf.printf "Miller-Rabin primality test program 1: "; +match reduce program 179424673 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* should return 1 because not prime *) -Printf.printf "Miller-Rabin primality test program: %d\n" (reduce program 179424675) +Printf.printf "Miller-Rabin primality test program 2: "; +match reduce program 179424675 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; diff --git a/test/testingImpParser.expected b/test/testingImpParser.expected index 28a758d..bd227e4 100644 --- a/test/testingImpParser.expected +++ b/test/testingImpParser.expected @@ -5,5 +5,5 @@ Hailstone sequence's lenght program: 351 Sum multiples of 3 and 5 program: 35565945 Rand program: true Fibonacci program: 4807526976 -Miller-Rabin primality test program: 0 -Miller-Rabin primality test program: 1 +Miller-Rabin primality test program 1: 0 +Miller-Rabin primality test program 2: 1 diff --git a/test/testingImpParser.ml b/test/testingImpParser.ml index 97a391f..dcacecd 100644 --- a/test/testingImpParser.ml +++ b/test/testingImpParser.ml @@ -6,123 +6,161 @@ let get_result x = (* -------------------------------------------------------------------------- *) (* Identity program *) let program = - "main a b {b := a}" + "def main with input a output b as b := a" ;; -Printf.printf "Identity program: %d\n" (get_result program 1);; +Printf.printf "Identity program: "; +match get_result program 1 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg +;; (* -------------------------------------------------------------------------- *) (* y not defined program *) let program = - "main a b {x := 1; b := a + x + y}" + "def main with input a output b as x := 1; b := a + x + y" ;; -try - Printf.printf "y not defined program: %d\n" (get_result program 100) -with Types.AbsentAssignment s -> - Printf.printf "y not defined program: %s\n" s +Printf.printf "y not defined program: "; +match get_result program 100 with + Ok d -> Printf.printf "error: %d\n" d +| Error `AbsentAssignment msg -> Printf.printf "%s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) (* Factorial program *) let program = -"main a b { +"def main with input a output b as b := 1; - for (i := 1, i <= a, i := i + 1) do { + for (i := 1, i <= a, i := i + 1) do b := b * i; - } -} " ;; -Printf.printf "Factorial program: %d\n" (get_result program 10) +Printf.printf "Factorial program: "; +match get_result program 10 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) (* Hailstone sequence's lenght program *) let program = -"main a b { +"def main with input a output b as b := 1; - while (not a == 1) do { + while not a == 1 do ( b := b + 1; - if ((a % 2) == 1) a := 3 * a + 1 else a := a / 2 - } -}" + if ((a % 2) == 1) then a := 3 * a + 1 else a := a / 2 + ) +" ;; -Printf.printf "Hailstone sequence's lenght program: %d\n" (get_result program 77031) +Printf.printf "Hailstone sequence's lenght program: "; +match get_result program 77031 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) (* Sum multiples of 3 and 5 program *) let program = -"main a b { +"def main with input a output b as b := 0; - for (i := 0, i <= a, i := i+1) do { - if ( i % 3 == 0 || i % 5 == 0) {b := b + i} else {skip} - } -}" + for (i := 0, i <= a, i := i+1) do + if (i % 3 == 0 || i % 5 == 0) then b := b + i; + else skip; +" ;; -Printf.printf "Sum multiples of 3 and 5 program: %d\n" (get_result program 12345) +Printf.printf "Sum multiples of 3 and 5 program: "; +match get_result program 12345 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) (* Rand program *) let program = - "main a b {b := rand(a)}" + "def main with input a output b as b := rand(a)" ;; -Printf.printf "Rand program: %b\n" ((get_result program 10) < 10) +Printf.printf "Rand program: "; +match get_result program 10 with + Ok d -> Printf.printf "%b\n" (d < 10) +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) (* Fibonacci program *) let program = -"main n fnext { +"def main with input n output fnext as fnow := 0; fnext := 1; - while (n > 1) do { + while (n > 1) do ( tmp := fnow + fnext; fnow := fnext; fnext := tmp; - n := n - 1 - } -}" + n := n - 1; + ) +" ;; -Printf.printf "Fibonacci program: %d\n" (get_result program 48) +Printf.printf "Fibonacci program: "; +match get_result program 48 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; (* -------------------------------------------------------------------------- *) (* Miller-Rabin primality test program *) let program = -"main n result { - result := 0; - s := 0; - while (0 == ((n - 1) / (2 ^ s)) % 2) do { - s := s + 1 - }; - d := ((n - 1) / 2 ^ s); - for (i := 20, i > 0, i := i - 1) do { - a := rand(n - 4) + 2; - x := powmod(a, d, n); - for (j := 0, j < s, j := j+1) do { - y := powmod(x, 2, n); - if (y == 1 && (not x == 1) && (not x == n - 1)) - {result := 1} - else - {skip}; - x := y - }; - if (not y == 1) {result := 1} else {skip} - } -}" +"def main with input n output result as + if (n % 2) == 0 then result := 1 + else ( + + result := 0; + s := 0; + while (0 == ((n - 1) / (2 ^ s)) % 2) do ( + s := s + 1 + ); + d := ((n - 1) / 2 ^ s); + for (i := 20, i > 0, i := i - 1) do ( + a := rand(n - 4) + 2; + x := powmod(a, d, n); + for (j := 0, j < s, j := j+1) do ( + y := powmod(x, 2, n); + if (y == 1 && (not x == 1) && (not x == n - 1)) then + result := 1; + else + skip; + x := y; + ); + if not y == 1 then result := 1; + else skip; + ) + ) +" ;; (* should return 0 because prime *) -Printf.printf "Miller-Rabin primality test program: %d\n" (get_result program 179424673) +Printf.printf "Miller-Rabin primality test program 1: "; +match get_result program 179424673 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;; + (* should return 1 because not prime *) -Printf.printf "Miller-Rabin primality test program: %d\n" (get_result program 179424675) +Printf.printf "Miller-Rabin primality test program 2: "; +match get_result program 179424675 with + Ok d -> Printf.printf "%d\n" d +| Error `AbsentAssignment msg -> Printf.printf "error -> %s\n" msg +| Error `DivisionByZero msg -> Printf.printf "error -> %s\n" msg ;;