Website Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit94ea551501a130b45a795c372d49a8aede276950 (patch)
Author
 YanaRG <alexkolbeim@gmail.com>
2018-11-27 12:11:46 +0200
Committer
 dtrendafilov <trendafilov.dn@gmail.com>
2018-11-27 12:11:46 +0200
Files0bc2c71a3a02efdb4c630cf76f7cfe135e3e1984
IPL-94ea551501a130b45a795c372d49a8aede276950.tar
IPL-94ea551501a130b45a795c372d49a8aede276950.tar.gz
IPL-94ea551501a130b45a795c372d49a8aede276950.zip
Parent0ee080abc8a84c0d9f489b7c782448188d8fd0cf (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.
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;
-}