Skip to content

Commit d850da3

Browse files
author
Sala Nicholas
committed
First commit
0 parents  commit d850da3

26 files changed

+1133
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bin/

funny.txt

+210
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
2+
3+
4+
5+
6+
7+
/*
8+
{ ->
9+
print("Hello, world!\n");
10+
print("Hi!", "\n");
11+
println("你好");
12+
}
13+
*/
14+
15+
16+
17+
{_true _false _if ->
18+
_true = {(t f) -> t};
19+
_false = {(t f) -> f};
20+
_if = {(c t e) -> c(t, e)()};
21+
22+
println(_if(_true, {-> while true do {} od}, {-> "False"}))
23+
}
24+
25+
26+
/*
27+
{average sqr abs sqrt x ->
28+
average = {(x y) -> (x + y) / 2};
29+
sqr = {(x) -> x * x};
30+
abs = {(x) -> if x >= 0 then x else -x fi};
31+
sqrt = {(x) tolerance isGoodEnough improve sqrtIter ->
32+
tolerance = 1e-30;
33+
34+
isGoodEnough = {(guess) -> abs(sqr(guess) - x) < tolerance};
35+
improve = {(guess) -> average(guess, x / guess)};
36+
sqrtIter = {(guess) ->
37+
if isGoodEnough(guess) then guess else sqrtIter(improve(guess)) fi
38+
};
39+
sqrtIter(1)
40+
};
41+
42+
x = 16;
43+
println("sqrt(", x, "): ", sqrt(x));
44+
}
45+
*/
46+
47+
48+
49+
50+
{coin change ->
51+
coin = {(index) ->
52+
if index == 0
53+
then 500
54+
else if index == 1
55+
then 200
56+
else if index == 2
57+
then 100
58+
else if index == 3
59+
then 50
60+
else if index == 4
61+
then 20
62+
else if index == 5
63+
then 10
64+
else if index == 6
65+
then 5
66+
fi
67+
fi
68+
fi
69+
fi
70+
fi
71+
fi
72+
fi
73+
};
74+
75+
change = {(amount index) ->
76+
if amount == 0 then 1
77+
else if amount < 0 then 0
78+
else if index >= 7 then 0
79+
else change(amount, index + 1) + change(amount - coin(index), index)
80+
fi
81+
fi
82+
fi
83+
};
84+
85+
println(change(50, 0))
86+
}
87+
88+
89+
90+
91+
/*{makeCounter myCounter yourCounter n ->
92+
93+
makeCounter = {(balance) ->
94+
{(amount) -> balance += amount}
95+
};
96+
97+
myCounter = makeCounter(100);
98+
yourCounter = makeCounter(50);
99+
100+
println("myCounter: ", myCounter(0));
101+
println("yourCounter: ", yourCounter(0));
102+
println();
103+
104+
n = 0;
105+
while n < 10 do
106+
println("myCounter[", n, "]: ", myCounter(50));
107+
println("yourCounter[", n, "]: ", yourCounter(-10));
108+
println();
109+
n += 1
110+
od
111+
}
112+
*/
113+
114+
115+
/*
116+
{isOdd isEven ->
117+
isOdd = {(n) -> if n == 0 then false else isEven(n - 1) fi};
118+
isEven = {(n) -> if n == 0 then true else isOdd(n - 1) fi};
119+
120+
println(isEven(1000));
121+
}
122+
*/
123+
124+
/*
125+
{-> println({->} + "a")}
126+
*/
127+
128+
/*
129+
{a sqr x ->
130+
131+
sqr = {(x) -> x * x};
132+
x = {(z) -> sqr};
133+
134+
println(x(2)(3));
135+
136+
println(10 / 3);
137+
println(20 / 3);
138+
139+
println({(x)->{() -> x}}(4)());
140+
7(8);
141+
142+
a = 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024;
143+
println(a);
144+
println(1 / a);
145+
println(1 / a * a);
146+
println(1 / a * a == 1);
147+
148+
println(3.27 % .7);
149+
}
150+
*/
151+
152+
/*
153+
{fib ->
154+
fib = {(n) ->
155+
if n < 2 then n else fib(n - 1) + fib(n - 2) fi
156+
};
157+
158+
println(fib(40))
159+
}
160+
*/
161+
162+
/*
163+
{fib ->
164+
fib = {(n) fib0 fib1 fib ->
165+
fib0 = 1;
166+
fib1 = 0;
167+
while n > 0 do
168+
fib = fib0 + fib1;
169+
fib0 = fib1;
170+
fib1 = fib;
171+
n -= 1
172+
od;
173+
fib1
174+
};
175+
176+
println(fib(10000))
177+
}
178+
*/
179+
180+
181+
182+
183+
/*
184+
{hanoi ->
185+
hanoi = {(n from to via) ->
186+
if n > 0 then
187+
hanoi(n - 1, from, via, to);
188+
println(from, " -> ", to);
189+
hanoi(n - 1, via, to, from)
190+
fi
191+
};
192+
hanoi(10, "left", "right", "center")
193+
}
194+
*/
195+
196+
197+
198+
/*
199+
{ pair head tail tree ->
200+
pair = {(h t) -> {(p) -> p(h, t)}};
201+
head = {(p) -> p({(h t) -> h})};
202+
tail = {(p) -> p({(h t) -> t})};
203+
204+
tree = pair(1, pair(pair("two", 42), pair(true, nil)));
205+
println(head(head(tail(tree))));
206+
}
207+
*/
208+
209+
// a line comment
210+

grammatica_funny.txt

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
EBNF grammar for Funny
2+
3+
variable *names* start with lowercase, token *names* start with Uppercase.
4+
5+
---- * 0 o più
6+
---- + 1 o più
7+
---- ? 0 o 1
8+
9+
program ::= function Eos .
10+
11+
function ::= "{" optParams optLocals optSequence "}" .
12+
optParams ::= ( "(" optIds ")" )? .
13+
optLocals ::= optIds .
14+
optSequence ::= ( "->" sequence )? .
15+
optIds::= id* .
16+
id ::= Id .
17+
18+
sequence ::= optAssignment ( ";" optAssignment )* .
19+
optAssignment := assignment? .
20+
assignment ::= Id ( "=" | "+=" | "-=" | "*=" | "/=" | "%=" ) assignment
21+
| logicalOr .
22+
23+
logicalOr ::= logicalAnd ( "||" logicalOr )? .
24+
logicalAnd ::= equality ( "&&" logicalAnd )? .
25+
equality ::= comparison ( ( "==" | "!=" ) comparison )? . binary binaryExpr()
26+
comparison ::= add ( ( "<" | "<=" | ">" | ">=" ) add )? . binary
27+
add ::= mult ( ( "+" | "-" ) mult )* . binary
28+
mult ::= unary ( ( "*" | "/" | "%" ) unary )* . binary
29+
unary ::= ( "+" | "-" | "!" ) unary
30+
| postfix .
31+
32+
postfix ::= primary args* .
33+
args ::= "(" ( sequence ( "," sequence )* )? ")" .
34+
primary ::= num | bool | nil | string
35+
| getId
36+
| function
37+
| subsequence
38+
| cond
39+
| loop
40+
| print .
41+
42+
num ::= Num .
43+
bool ::= True | False .
44+
nil ::= Nil .
45+
string ::= String .
46+
getId ::= Id .
47+
subsequence ::= "(" sequence ")" .
48+
cond ::= ( "if" | "ifnot" ) sequence "then" sequence ( "else" sequence )? "fi" .
49+
loop ::= ( "while" | "whilenot" ) sequence ( "do" sequence )? "od" .
50+
print ::= ( "print" | "println" ) args .
51+

src/exception/ParserException.java

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package exception;
2+
3+
public class ParserException extends Exception{
4+
5+
public ParserException(String message){
6+
System.err.println(message);
7+
}
8+
}

src/exception/TokenizerException.java

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package exception;
2+
3+
public class TokenizerException extends Exception{
4+
5+
public TokenizerException(String message){
6+
System.err.println(message);
7+
}
8+
}

src/interpreter/Env.java

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package interpreter;
2+
3+
public class Env {
4+
private final Env enclosing;
5+
private final Frame frame;
6+
7+
Env(Frame frame, Env env)
8+
9+
10+
}

src/interpreter/Frame.java

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package interpreter;
2+
3+
public class Frame {
4+
private final HashMap<String, Val> bindings = new HashMap<String, Val>();
5+
6+
7+
}

src/interpreter/NumVal.java

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package interpreter;
2+
3+
public class NumVal {
4+
5+
}

src/interpreter/Val.java

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package interpreter;
2+
3+
public class Val {
4+
5+
BoolVal checkBool(){
6+
throw new InterpreterException(this + " Is not a bool");
7+
}
8+
}

src/main/Main.java

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package main;
2+
3+
import java.io.IOException;
4+
import java.io.StringReader;
5+
import java.nio.file.Files;
6+
import java.nio.file.Paths;
7+
8+
import exception.TokenizerException;
9+
import tokenizer.Token;
10+
import tokenizer.Tokenizer;
11+
import tokenizer.Type;
12+
13+
public class Main {
14+
15+
public static void main(String[] args) throws IOException, TokenizerException {
16+
byte[] data = Files.readAllBytes(Paths.get(System.getProperty("user.dir") + "/funny.txt"));
17+
Tokenizer t = new Tokenizer(new StringReader(new String(data)));
18+
Token temp;
19+
do {
20+
temp = t.next();
21+
System.out.println(temp);
22+
}while(temp.getType() != Type.EOS);
23+
}
24+
25+
}

src/parser/BinaryExpr.java

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package parser;
2+
3+
import tokenizer.Type;
4+
5+
public class BinaryExpr extends Expr{
6+
7+
BinaryExpr(Expr first, Type operation, Expr second){
8+
9+
}
10+
}

src/parser/Expr.java

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package parser;
2+
3+
abstract class Expr {
4+
//abstract Interpreter interpret();
5+
}

src/parser/ExprList.java

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package parser;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class ExprList {
7+
private final List<Expr> exprs;
8+
9+
ExprList(){
10+
exprs = new ArrayList<Expr>();
11+
}
12+
13+
public void add(Expr expr) {
14+
exprs.add(expr);
15+
}
16+
}

src/parser/FunExpr.java

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package parser;
2+
3+
public class FunExpr extends Expr{
4+
private final List<String> params;
5+
private final List<String> locals;
6+
private final Expr code;
7+
8+
9+
@Override
10+
Val eval(Env env) {
11+
return new ClousureVal(env, this);
12+
}
13+
}

src/parser/GetVarExpr.java

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package parser;
2+
3+
public class GetVarExpr extends Expr{
4+
5+
}

0 commit comments

Comments
 (0)