Commit a974ecee authored by Taddeüs Kroes's avatar Taddeüs Kroes

Added finite repeat instruction and utf8/latex stringification commands

parent 739a8a89
...@@ -20,11 +20,12 @@ program: ...@@ -20,11 +20,12 @@ program:
{ instrs } { instrs }
instruction: instruction:
| c=LOWER { Basic c } | c=LOWER { Basic c }
| EXCLAM { Terminate } | EXCLAM { Terminate }
| PLUS c=LOWER { Ptest c } | PLUS c=LOWER { Ptest c }
| MINUS c=LOWER { Ntest c } | MINUS c=LOWER { Ntest c }
| HASH n=NUMBER { Jump n } | HASH n=NUMBER { Jump n }
| i=instruction OMEGA { Repeat i } | i=instruction n=NUMBER { Repeat (i, n) }
| c=UPPER { Program c } | i=instruction OMEGA { Loop i }
| c=UPPER { Program c }
| LPAREN i=separated_list(SEMICOL, instruction) RPAREN { Concat i } | LPAREN i=separated_list(SEMICOL, instruction) RPAREN { Concat i }
...@@ -7,8 +7,10 @@ let main () = ...@@ -7,8 +7,10 @@ let main () =
prerr_endline "command:"; prerr_endline "command:";
prerr_endline " help show this help page"; prerr_endline " help show this help page";
prerr_endline " echo TERM pretty-print a program"; prerr_endline " echo TERM pretty-print a program";
prerr_endline " utf8 TERM print a program in UTF-8 format";
prerr_endline " latex TERM print latex source for a program";
prerr_endline " norm TERM get the norm of a program"; prerr_endline " norm TERM get the norm of a program";
prerr_endline " i TERM get the ith instruction of a program"; prerr_endline " i I TERM get the Ith instruction of a program";
prerr_endline " dot TERM generate Dot code for a flow graph"; prerr_endline " dot TERM generate Dot code for a flow graph";
prerr_endline "input program syntax:"; prerr_endline "input program syntax:";
prerr_endline " - write star (*) instead of omega sign"; prerr_endline " - write star (*) instead of omega sign";
...@@ -38,7 +40,11 @@ let main () = ...@@ -38,7 +40,11 @@ let main () =
| "help" -> | "help" ->
usage 0 usage 0
| "echo" -> | "echo" ->
print_endline (string_of_program (input_term 2)) print_endline (string_of_program_ascii (input_term 2))
| "utf8" ->
print_endline (string_of_program_utf8 (input_term 2))
| "latex" ->
print_endline (string_of_program_latex (input_term 2))
| "norm" | "i" | "dot" -> | "norm" | "i" | "dot" ->
raise (Failure "not implemented") raise (Failure "not implemented")
| _ -> | _ ->
......
open Types open Types
(* let utf8_omega = "\xcf\x89"
let omega = "\xcf\x89" let utf8_pound = "\xc2\xa3"
let pound = "\xc2\xa3" let utf8_super = [|
*) "\xe2\x81\xb0"; "\xc2\xb9"; "\xc2\xb2"; "\xc2\xb3"; "\xe2\x81\xb4";
let omega = "*" "\xe2\x81\xb5"; "\xe2\x81\xb6"; "\xe2\x81\xb7"; "\xe2\x81\xb8"; "\xe2\x81\xb9"
let pound = "$" |]
let rec string_of_instruction = function let cat string_of_ins instrs =
| Basic c -> Char.escaped c "(" ^ String.concat ";" (List.map string_of_ins instrs) ^ ")"
| Terminate -> "!"
| Ptest c -> "+" ^ Char.escaped c let rec string_of_ins_ascii = function
| Ntest c -> "-" ^ Char.escaped c | Basic c -> Char.escaped c
| Jump len -> "#" ^ string_of_int len | Terminate -> "!"
| Ptest c -> "+" ^ Char.escaped c
| Concat l -> "(" ^ String.concat ";" (List.map string_of_instruction l) ^ ")" | Ntest c -> "-" ^ Char.escaped c
| Repeat i -> string_of_instruction i ^ omega | Jump len -> "#" ^ string_of_int len
| Program c -> Char.escaped c | Concat l -> cat string_of_ins_ascii l
| Empty -> "" | Repeat (i, n) -> string_of_ins_ascii i ^ string_of_int n
| Loop i -> string_of_ins_ascii i ^ "*"
let rec string_of_program instrs =
String.concat ";" (List.map string_of_instruction instrs) | Program c -> Char.escaped c
| Empty -> ""
let rec string_of_ins_utf8 = function
| Concat l -> cat string_of_ins_utf8 l
| Repeat (i, n) when n <= 9 -> string_of_ins_utf8 i ^ utf8_super.(n)
| Loop i -> string_of_ins_utf8 i ^ utf8_omega
| i -> string_of_ins_ascii i
let rec string_of_ins_latex = function
| Concat l -> cat string_of_ins_latex l
| Repeat (i, n) -> string_of_ins_latex i ^ "^{" ^ string_of_int n ^ "}"
| Loop i -> string_of_ins_latex i ^ "^\\omega"
| i -> string_of_ins_ascii i
let string_of_program_ascii instrs =
String.concat ";" (List.map string_of_ins_ascii instrs)
let string_of_program_utf8 instrs =
String.concat ";" (List.map string_of_ins_utf8 instrs)
let string_of_program_latex instrs =
"$" ^ String.concat ";" (List.map string_of_ins_latex instrs) ^ "$"
type instruction = type ins =
| Basic of char | Basic of char (* a *)
| Terminate | Terminate (* ! *)
| Ptest of char | Ptest of char (* +a *)
| Ntest of char | Ntest of char (* -a *)
| Jump of int | Jump of int (* #1 *)
| Concat of instruction list | Concat of ins list (* a;b *)
| Repeat of instruction | Repeat of ins * int (* a2 : execute a twice *)
| Loop of ins (* a* : repeat a infinitely *)
| Program of char | Program of char (* X *)
| Empty | Empty
type program = instruction list type program = ins list
exception FatalError of string exception FatalError of string
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment