diff options
| Commit | 94ea551501a130b45a795c372d49a8aede276950 (patch) | |
|---|---|---|
| Author | 2018-11-27 12:11:46 +0200 | |
| Committer | 2018-11-27 12:11:46 +0200 | |
| Files | 0bc2c71a3a02efdb4c630cf76f7cfe135e3e1984 | |
| IPL-94ea551501a130b45a795c372d49a8aede276950.tar IPL-94ea551501a130b45a795c372d49a8aede276950.tar.gz IPL-94ea551501a130b45a795c372d49a8aede276950.zip | ||
| Parent | 0ee080abc8a84c0d9f489b7c782448188d8fd0cf (diff) | |
HW3.2 Brainf interpreter (#43)
* Create README.md
* Initial commit
* Initial commit
* Create README.md
* Rename homework/81281/c2html.pl to homework/81281/c2html/c2html.pl
* Rename homework/81281/test.c to homework/81281/c2html/test.c
* Update README.md
* Update README.md
* Update c2html.pl
* Update c2html.pl
* Update c2html.pl
* Update README.md
* Update c2html.pl
* Update test.c
* Create executeProgram.sh
* Update README.md
* Update c2html.pl
* Initial commit of updated code + prettify C
* Rename secret.c to messyCode.c
* Update and rename test.c to initialTest.c
* Update README.md
* Update README.md
* Update README.md
* Update README.md
* Rename executeProgram.sh to c2htmlrun.sh
* Update README.md
* Update prettify.pl
* Update prettify.pl
* Update messyCode.c
* Fixed some bugs.
* Update README.md
* Update c2html.pl
* Added collapse and fixed matrix representation.
* Updated flatten and added predicate for function identification.
* Update initialTest.c
* Update messyCode.c
* Bug fixing, added is_functionAndBody predicate.
* Update print.pl
* Result after applying prettify and added collapse functions
* Can identify structures and collapse them too
* Can identify structures and collapse them too
* Can identify structures and collapse them too
* Can identify structures and collapse them too
* Can identify structures and collapse them too
* Update messyCode.c
* Update README.md
* Update prettify.pl
* Update README.md
* Update prettify.pl
* Update messyCode.c
* Update messyCode.c
* Update page.html
* Fix bug typedef
* Update page.html
* Added choices
* Update c2html.pl
* Update prettify.pl
* Update prettify.pl
* Update README.md
* Update README.md
* Update c2html.pl
* Update c2html.pl
* Added forgotten do-while structure format
* Update messyCode.c
* Removing unknown tokens from stream
* Rename homework/81281/c2html/page.html to homework/81281/c2html/exampleCodeAndTestPage/page.html
* Rename homework/81281/c2html/messyCode.c to homework/81281/c2html/exampleCodeAndTestPage/messyCode.c
* Rename homework/81281/c2html/initialTest.c to homework/81281/c2html/exampleCodeAndTestPage/initialTest.c
* Update prettify.pl
* Can collapse all control structures and fixed comment /**/
* Can collapse all control structures and fixed comment /**/
* Can collapse all control structures and fixed comment /**/
* Can collapse all control structures and fixed comment /**/
* Can collapse all control structures and fixed comment /**/
* Fixed named of predicates
* Update messyCode.c
* Update page.html
* Update README.md
* Changed execTAB to "\s\s\s\s"
* Changed execTAB to "\s\s\s\s"
* Changed execTAB to "\s\s\s\s"
* Update page.html
* Added new tokens (forgotten operators) and added rules for them
* Added new tokens (forgotten operators) and fixed some old predicates
* Fixed bug with "else '\n' if (..)" in addNewLines predicate
* Fixed regular expression for a string and removed token ttypesPrintF
* Added clauses for handling enum and fixed handling of chars
* Fixed typos
* Added forgotten token to clause
* Fixed "case smt :'\n'" where smt is more than one char
* Fixed some bugs and divided code in modules
* New code module and fixed bugs
* Fixed some bugs with tabulation
* Divided code in modules
* Delete executeProgram.sh
* Delete test.c
* Initial version, still very buggy.
* Finished with bug killing.
* Fixed readme and added new program for tests.
* Forgotten line added.
* Organizing stuff in different folders.
* Forgot to delete files.
* Fixed typo.
10 files changed, 290 insertions, 99 deletions
| -rw-r--r-- | homework/81281/brainf***Interpreter/README.md | 21 | ||||
| -rw-r--r-- | homework/81281/brainf***Interpreter/brainySource.pl | 132 | ||||
| -rw-r--r-- | homework/81281/brainf***Interpreter/interpreterMain.pl | 35 | ||||
| -rwxr-xr-x | homework/81281/brainf***Interpreter/runMeChooseMode.sh | 15 | ||||
| -rw-r--r-- | homework/81281/brainf***Interpreter/testPrograms/bigProgram.b | 32 | ||||
| -rw-r--r-- | homework/81281/brainf***Interpreter/testPrograms/input.txt | 1 | ||||
| -rw-r--r-- | homework/81281/brainf***Interpreter/testPrograms/pr.b | 21 | ||||
| -rw-r--r-- | homework/81281/brainf***Interpreter/testPrograms/smallProgram.b | 33 | ||||
| -rw-r--r-- | homework/81281/c2html/executeProgram.sh | 12 | ||||
| -rw-r--r-- | homework/81281/c2html/test.c | 87 |
diff --git a/homework/81281/brainf***Interpreter/README.md b/homework/81281/brainf***Interpreter/README.md new file mode 100644 index 0000000..29d4b63 --- /dev/null +++ b/homework/81281/brainf***Interpreter/README.md @@ -0,0 +1,21 @@ +# Homework 3.2 + +## Create a brainf*** interpreter + +_The interpreter reads from a file if there is input._ + +### How to install and use SWI-Prolog + ++ [How to install SWI-Prolog](https://wwu-pi.github.io/tutorials/lectures/lsp/010_install_swi_prolog.html) + ++ [Quick start on how to use it](http://www.swi-prolog.org/pldoc/man?section=quickstart) + ++ [Command line options](http://www.swi-prolog.org/pldoc/man?section=cmdline) + +### Added bash script for executing program after successful installation of SWI-Prolog on a Unix or Unix-like variants + +[Script](./runMeChooseMode.sh) + +_Mode 0 is for interactive interpretation and 1 is for interpretation of a file._ + +**The interpreter is a bit slow if the program has a lot of loops with the current method of handling loops. Also Prolog isn't the fastest PL of them all xD.** diff --git a/homework/81281/brainf***Interpreter/brainySource.pl b/homework/81281/brainf***Interpreter/brainySource.pl new file mode 100644 index 0000000..6c73192 --- /dev/null +++ b/homework/81281/brainf***Interpreter/brainySource.pl @@ -0,0 +1,132 @@ +token(tNextCellAddress) --> ">", !. +token(tLastCellAddress) --> "<", !. +token(tPlusPlusCellContent) --> "+", !. +token(tMinusMinusCellContent) --> "-", !. +token(tWriteCellContent) --> ".", !. +token(tReadCellContent) --> ",", !. +token([tWhileLoop|Body]) --> "[", parseLoop(Body), "]". +token(tUnknown) --> allThatIsNotAToken(I), !, {I \= []}. + +parseLoop([]) --> "". +parseLoop([H|T]) --> token(H), !, parseLoop(T). + +allThatIsNotAToken([C|Cs]) --> [C|Cs], \+ token(C), \+ token([C|Cs]), + allThatIsNotAToken(Cs). +allThatIsNotAToken([]) --> []. + +parceBF([H|T]) --> token(H), !, parceBF(T). +parceBF([]) --> [], !. + +cleanUnknownAndCountInput([], [], 0):- !. +cleanUnknownAndCountInput([tUnknown|T], R, InputCnt):- + cleanUnknownAndCountInput(T, R, InputCnt). +cleanUnknownAndCountInput([tReadCellContent|T], [tReadCellContent|R], InputCnt):- + cleanUnknownAndCountInput(T, R, TInputCnt), + InputCnt is TInputCnt + 1. +cleanUnknownAndCountInput([H|T], [H|R], InputCnt):- + \+ is_list(H), + H \= tUnknown, + H \= tReadCellContent, + cleanUnknownAndCountInput(T, R, InputCnt). +cleanUnknownAndCountInput([H|T], R, InputCnt):- + is_list(H), + cleanUnknownAndCountInput(H, R1, InputBitH), + cleanUnknownAndCountInput(T, R2, InputBitT), + InputCnt is InputBitH + InputBitT, + append([R1], R2, R). + +interpret(StreamCodes):- + phrase(parceBF(CommandsU), StreamCodes), + cleanUnknownAndCountInput(CommandsU, Commands, InputCnt), + ((InputCnt =\= 0, + write("\nThere are input symbols, so ready to read from a file.\nPlease enter the name of the file:\s"), + current_stream(0, read, Stream), + read_line_to_codes(Stream, Read), + open(Read, read, ReadStream)); + (ReadStream = [])), + execute(Commands, [[],[0]], ReadStream), + !. + + +execute([], _, _). + +execute([[tWhileLoop|Body]|Rest], Memory, ReadStream):- + Memory = [_,[CurrCellContent|_]], + CurrCellContent =\= 0, + append(Body, [[tWhileLoop|Body]|Rest], NewRest), + % write("While loop not 0: "), + % write(NewRest), nl, + !, + execute(NewRest, Memory, ReadStream). + +execute([[tWhileLoop|_]|Rest], Memory, ReadStream):- + Memory = [_,[CurrCellContent|_]], + CurrCellContent =:= 0, + !, + % write("While loop is 0: "), + % write(Rest), nl, + execute(Rest, Memory, ReadStream). + +execute([tReadCellContent|Rest], Memory, ReadStream):- + executeCommand(tReadCellContent, Memory, UpdatedMemory, ReadStream, ResultStream), + !, + execute(Rest, UpdatedMemory, ResultStream). + +execute([tReadCellContent|Rest], Memory, []):- + !, + execute(Rest, Memory, []). + +execute([CurrentCommand|Rest], Memory, ReadStream):- + executeCommand(CurrentCommand, Memory, UpdatedMemory), + !, + execute(Rest, UpdatedMemory, ReadStream). + + +executeCommand(tNextCellAddress, [PrevAddrs, [CurrAddr|NextAddrs]], [NewPrevAddrs, NewNextAddrs]):- + append(PrevAddrs, [CurrAddr], NewPrevAddrs), + ((NextAddrs == [], NewNextAddrs = [0]) ; (NewNextAddrs = NextAddrs)). + % write("Operation: "), write(tNextCellAddress), + % write(" Old memory: "), write([PrevAddrs, [CurrAddr|NextAddrs]]), + % write(" New memory: "), write([NewPrevAddrs, NewNextAddrs]), + % nl. + +executeCommand(tLastCellAddress, [PrevAddrs, CurrAddrs], [MorePrevAddrs, [PrevAddr|CurrAddrs]]):- + append(MorePrevAddrs, [PrevAddr], PrevAddrs). + % write("Operation: "), write(tLastCellAddress), + % write(" Old memory: "), write([PrevAddrs, CurrAddrs]), + % write(" New memory: "), write([MorePrevAddrs, [PrevAddr|CurrAddrs]]), + % nl. + +executeCommand(tPlusPlusCellContent, CurrentMemory, [PrevAddrs, [NewCurrentCell|RestAddrs]]):- + CurrentMemory = [PrevAddrs, [CurrentCell|RestAddrs]], + Temp is CurrentCell + 1, + ((Temp > 255, NewCurrentCell is 0); (NewCurrentCell is Temp)). + % write("Operation: "), write(tPlusPlusCellContent), + % write(" New memory: "), write([PrevAddrs, [NewCurrentCell|RestAddrs]]), + % nl. + +executeCommand(tMinusMinusCellContent, CurrentMemory, [PrevAddrs, [NewCurrentCell|RestAddrs]]):- + CurrentMemory = [PrevAddrs, [CurrentCell|RestAddrs]], + Temp is CurrentCell - 1, + ((Temp < 0, NewCurrentCell is 255); (NewCurrentCell is Temp)). + % write("Operation: "), write(tMinusMinusCellContent), + % write(" New memory: "), write([PrevAddrs, [NewCurrentCell|RestAddrs]]), + % nl. + +executeCommand(tWriteCellContent, CurrentMemory, CurrentMemory):- + CurrentMemory = [_, [CurrentCell|_]], + char_code(Character, CurrentCell), + write(Character). + +executeCommand(tReadCellContent, [PrevAddrs, [_|RestAddrs]], [PrevAddrs, [NewCellContent|RestAddrs]], ReadStream, ReadStream):- + is_stream(ReadStream), + get_code(ReadStream, CurrentInput), + CurrentInput >= 0, + ((char_code('\r', CurrentInput), char_code('\n', NL), NewCellContent = NL); + (NewCellContent = CurrentInput)). + +executeCommand(tReadCellContent, [PrevAddrs, [CurrCelContent|RestAddrs]], [PrevAddrs, [CurrCelContent|RestAddrs]], ReadStream, []):- + is_stream(ReadStream), + get_code(ReadStream, CurrentInput), + CurrentInput == -1, + close(ReadStream). diff --git a/homework/81281/brainf***Interpreter/interpreterMain.pl b/homework/81281/brainf***Interpreter/interpreterMain.pl new file mode 100644 index 0000000..ff51f34 --- /dev/null +++ b/homework/81281/brainf***Interpreter/interpreterMain.pl @@ -0,0 +1,35 @@ +:- use_module(library(dcg/basics)). +:- use_module(library(readutil)). +:- use_module(library(quintus)). +:- [brainySource]. + +:- set_prolog_flag(verbose, silent). +:- initialization(main, main). + +main:- + current_prolog_flag(argv, Argv), + Argv = [H1|_], + atom_string(H1, Filename), + ((Filename == "", readyToReadAndInterpret("Hello, how can I help you?\nExit me by typing \"quit\".")); + (Filename \= "", readyToReadAndInterpret("Ready to interpret your file.\n", Filename))), + halt. +main:- + halt(1). + +readyToReadAndInterpret(Message):- + write(Message), + startCycleTillQuit. + +readyToReadAndInterpret(Message, File):- + write(Message), + open(File, read, RFile), + read_stream_to_codes(RFile, BFSource), + close(RFile), + interpret(BFSource). + +startCycleTillQuit:- + nl, + current_stream(0, read, Stream), + read_line_to_codes(Stream, BFProgram), + ((string_codes("quit", BFProgram), write("Bye!"), nl); + (interpret(BFProgram), startCycleTillQuit)). diff --git a/homework/81281/brainf***Interpreter/runMeChooseMode.sh b/homework/81281/brainf***Interpreter/runMeChooseMode.sh new file mode 100755 index 0000000..4162db4 --- /dev/null +++ b/homework/81281/brainf***Interpreter/runMeChooseMode.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +echo -ne "Please enter 0 for live interpreter or 1 for interpretation of a file: " +read mode + +base=`pwd`"/interpreterMain.pl" + +if [ $mode == 0 ] +then + exec swipl -q -f "$base" "" +else + echo -n "Please enter the name of the file: " + read fileName + exec swipl -q -f "$base" "$fileName" +fi diff --git a/homework/81281/brainf***Interpreter/testPrograms/bigProgram.b b/homework/81281/brainf***Interpreter/testPrograms/bigProgram.b new file mode 100644 index 0000000..2f311a7 --- /dev/null +++ b/homework/81281/brainf***Interpreter/testPrograms/bigProgram.b @@ -0,0 +1,32 @@ +99 bottles in 1752 brainfuck instructions +by jim crawford (http://www (dot) goombas (dot) org/) +>++++++++++[<++++++++++>-]<->>>>>+++[>+++>+++<<-]<<<<+<[>[>+ +>+<<-]>>[-<<+>>]++++>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<[[-]>> +>>>>[[-]<++++++++++<->>]<-[>+>+<<-]>[<+>-]+>[[-]<->]<<<<<<<< +<->>]<[>+>+<<-]>>[-<<+>>]+>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<< +<[>>+>+<<<-]>>>[-<<<+>>>]++>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]< +<[>+<[-]]<[>>+<<[-]]>>[<<+>>[-]]<<<[>>+>+<<<-]>>>[-<<<+>>>]+ ++++>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<[>+<[-]]<[>>+<<[-]]>>[< +<+>>[-]]<<[[-]>>>++++++++[>>++++++<<-]>[<++++++++[>++++++<-] +>.<++++++++[>------<-]>[<<+>>-]]>.<<++++++++[>>------<<-]<[- +>>+<<]<++++++++[<++++>-]<.>+++++++[>+++++++++<-]>+++.<+++++[ +>+++++++++<-]>.+++++..--------.-------.++++++++++++++>>[>>>+ +>+<<<<-]>>>>[-<<<<+>>>>]>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<<< +[>>>+>+<<<<-]>>>>[-<<<<+>>>>]+>+<[-<->]<[[-]>>-<<]>>[[-]<<+> +>]<<<[>>+<<[-]]>[>+<[-]]++>>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]< ++<[[-]>-<]>[<<<<<<<.>>>>>>>[-]]<<<<<<<<<.>>----.---------.<< +.>>----.+++..+++++++++++++.[-]<<[-]]<[>+>+<<-]>>[-<<+>>]+>+< +[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<<[>>+>+<<<-]>>>[-<<<+>>>]++++ +>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<[>+<[-]]<[>>+<<[-]]>>[<<+> +>[-]]<<[[-]>++++++++[<++++>-]<.>++++++++++[>+++++++++++<-]>+ +.-.<<.>>++++++.------------.---.<<.>++++++[>+++<-]>.<++++++[ +>----<-]>++.+++++++++++..[-]<<[-]++++++++++.[-]]<[>+>+<<-]>> +[-<<+>>]+++>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<[[-]++++++++++. +>+++++++++[>+++++++++<-]>+++.+++++++++++++.++++++++++.------ +.<++++++++[>>++++<<-]>>.<++++++++++.-.---------.>.<-.+++++++ +++++.++++++++.---------.>.<-------------.+++++++++++++.----- +-----.>.<++++++++++++.---------------.<+++[>++++++<-]>..>.<- +---------.+++++++++++.>.<<+++[>------<-]>-.+++++++++++++++++ +.---.++++++.-------.----------.[-]>[-]<<<.[-]]<[>+>+<<-]>>[- +<<+>>]++++>+<[-<->]<[[-]>>-<<]>>[[-]<<+>>]<<[[-]++++++++++.[ +-]<[-]>]<+<] diff --git a/homework/81281/brainf***Interpreter/testPrograms/input.txt b/homework/81281/brainf***Interpreter/testPrograms/input.txt new file mode 100644 index 0000000..341cc98 --- /dev/null +++ b/homework/81281/brainf***Interpreter/testPrograms/input.txt @@ -0,0 +1 @@ +example 123 diff --git a/homework/81281/brainf***Interpreter/testPrograms/pr.b b/homework/81281/brainf***Interpreter/testPrograms/pr.b new file mode 100644 index 0000000..1dce918 --- /dev/null +++ b/homework/81281/brainf***Interpreter/testPrograms/pr.b @@ -0,0 +1,21 @@ +Calculate the value 256 and test if it's zero +If the interpreter errors on overflow this is where it'll happen +++++++++[>++++++++<-]>[<++++>-] ++<[>-< + Not zero so multiply by 256 again to get 65536 + [>++++<-]>[<++++++++>-]<[>++++++++<-] + +>[> + # Print "32" + ++++++++++[>+++++<-]>+.-.[-]< + <[-]<->] <[>> + # Print "16" + +++++++[>+++++++<-]>.+++++.[-]< +<<-]] >[> + # Print "8" + ++++++++[>+++++++<-]>.[-]< +<-]< +# Print " bit cells\n" ++++++++++++[>+++>+++++++++>+++++++++>+<<<<-]>-.>-.+++++++.+++++++++++.<. +>>.++.+++++++..<-.>>- +Clean up used cells. +[[-]<] diff --git a/homework/81281/brainf***Interpreter/testPrograms/smallProgram.b b/homework/81281/brainf***Interpreter/testPrograms/smallProgram.b new file mode 100644 index 0000000..e080b7f --- /dev/null +++ b/homework/81281/brainf***Interpreter/testPrograms/smallProgram.b @@ -0,0 +1,33 @@ +[ This program prints Sierpinski triangle on 80-column display. ] + > + + + + + + + [ < + + + + + + + + + + + > - ] > + + + + + + + + + + [ > + + + + + + < - ] > + > + + > > > + > + > > + < + < < < < < < < < + < [ - [ - > + < + ] > [ - < + > > > . < < ] > > > + [ [ + - > + + + + + + + + + + [ > + + + + + < - ] > + . < < [ - > + < + ] + > [ - > + + + + + + + + + + + < < + > ] > . [ + - ] > ] + ] + < < < [ - [ + - > + < ] + > [ + - < + > > > - [ - > + < ] + + > + [ - < - > ] < < + < ] < < < < ] + + + + + + + + + + + . + + + . [ - ] < ] + + + + + + * * * * * M a d e * B y : * N Y Y R I K K I * 2 0 0 2 * * * * * diff --git a/homework/81281/c2html/executeProgram.sh b/homework/81281/c2html/executeProgram.sh deleted file mode 100644 index bc02714..0000000 --- a/homework/81281/c2html/executeProgram.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh - -echo -n "Please enter the name of the C file you wish to highlight:" -read fileName -echo $fileName -if ! [[ $fileName == *.c\n ]]; then - base=`pwd`"/c2html.pl" - PL=swipl - exec $PL -q -f "$base" "$fileName" -else - echo "Not a correct C filename!" -fi diff --git a/homework/81281/c2html/test.c b/homework/81281/c2html/test.c deleted file mode 100644 index 7176890..0000000 --- a/homework/81281/c2html/test.c +++ /dev/null @@ -1,87 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -int N = 0; -int a[750001] = {0}; -/*Problem Secrect DAA*/ -//// mauuu - -void swap(int* i, int* j) -{ - int t = *i; - *i = *j; - *j = t; -} - -int partition(int l, int r) -{ - int randIdx = l + rand() % (r - l); - - int pivot = a[randIdx]; - - swap(&a[l], &a[randIdx]); - int ind = l; - - for (int i = l + 1; i < r; ++i) - { - if (a[i] <= pivot) - { - ind++; - swap(&a[i], &a[ind]); - } - } - - swap(&a[l], &a[ind]); - return ind; -} - -void quickSort(int l, int r) -{ - if (l < r) - { - int idx = partition(l, r); - quickSort(l, idx); - quickSort(idx + 1, r); - } -} - -int binarySearch(int k) -{ - int middle, left = 0, right = N - 1; - if (k < a[left]) - return (-1); - if (k == a[left]) - return (left + 1); - if (k > a[right]) - return (-1); - - while (right - left > 1) - { - middle = (left + right) / 2; - if (k <= a[middle]) - right = middle; - else - left = middle; - } - return ((right <= N - 1 && a[right] == k) ? (right + 1) : (-1)); -} - -int main() -{ - srand(time(0)); - scanf("%d", &N); - for (int i = 0; i < N; ++i) - { - scanf("%d ", &a[i]); - } - quickSort(0, N); - - int tmp = 0; - scanf("%d", &tmp); - while (tmp != 0) - { - printf("%d\n", binarySearch(tmp)); - scanf("%d", &tmp); - } - return 0; -} |
