687
|
1 |
abstract class Token
|
|
2 |
case object T_SEMI extends Token
|
|
3 |
case object T_LPAREN extends Token
|
|
4 |
case object T_RPAREN extends Token
|
|
5 |
case class T_ID(s: String) extends Token
|
|
6 |
case class T_OP(s: String) extends Token
|
|
7 |
case class T_NUM(n: Int) extends Token
|
|
8 |
case class T_KWD(s: String) extends Token
|
|
9 |
case class T_STR(s: String) extends Token
|
|
10 |
|
|
11 |
|
|
12 |
// Loops program
|
|
13 |
//===============
|
|
14 |
|
|
15 |
/*
|
|
16 |
start := 1000;
|
|
17 |
x := start;
|
|
18 |
y := start;
|
|
19 |
z := start;
|
|
20 |
while 0 < x do {
|
|
21 |
while 0 < y do {
|
|
22 |
while 0 < z do { z := z - 1 };
|
|
23 |
z := start;
|
|
24 |
y := y - 1
|
|
25 |
};
|
|
26 |
y := start;
|
|
27 |
x := x - 1
|
|
28 |
}
|
|
29 |
*/
|
|
30 |
|
|
31 |
val loops =
|
|
32 |
List(T_ID("start"), T_OP(":="), T_NUM(1000), T_SEMI, T_ID("x"), T_OP(":="),
|
|
33 |
T_ID("start"), T_SEMI, T_ID("y"), T_OP(":="), T_ID("start"), T_SEMI,
|
|
34 |
T_ID("z"), T_OP(":="), T_ID("start"), T_SEMI, T_KWD("while"), T_NUM(0),
|
|
35 |
T_OP("<"), T_ID("x"), T_KWD("do"), T_LPAREN, T_KWD("while"), T_NUM(0),
|
|
36 |
T_OP("<"), T_ID("y"), T_KWD("do"), T_LPAREN, T_KWD("while"), T_NUM(0),
|
|
37 |
T_OP("<"), T_ID("z"), T_KWD("do"), T_LPAREN, T_ID("z"), T_OP(":="),
|
|
38 |
T_ID("z"), T_OP("-"), T_NUM(1), T_RPAREN, T_SEMI, T_ID("z"), T_OP(":="),
|
|
39 |
T_ID("start"), T_SEMI, T_ID("y"), T_OP(":="), T_ID("y"), T_OP("-"),
|
|
40 |
T_NUM(1), T_RPAREN, T_SEMI, T_ID("y"), T_OP(":="), T_ID("start"),
|
|
41 |
T_SEMI, T_ID("x"), T_OP(":="), T_ID("x"), T_OP("-"), T_NUM(1), T_RPAREN)
|
|
42 |
|
|
43 |
|
|
44 |
// Fib program
|
|
45 |
//=============
|
|
46 |
|
|
47 |
/*
|
|
48 |
write "Fib";
|
|
49 |
read n;
|
|
50 |
minus1 := 0;
|
|
51 |
minus2 := 1;
|
|
52 |
while n > 0 do {
|
|
53 |
temp := minus2;
|
|
54 |
minus2 := minus1 + minus2;
|
|
55 |
minus1 := temp;
|
|
56 |
n := n - 1
|
|
57 |
};
|
|
58 |
write "Result";
|
|
59 |
write minus2
|
|
60 |
*/
|
|
61 |
|
|
62 |
val fib =
|
|
63 |
List(T_KWD("write"), T_STR("Fib"), T_SEMI, T_KWD("read"), T_ID("n"),
|
|
64 |
T_SEMI, T_ID("minus1"), T_OP(":="), T_NUM(0), T_SEMI, T_ID("minus2"),
|
|
65 |
T_OP(":="), T_NUM(1), T_SEMI, T_KWD("while"), T_ID("n"), T_OP(">"),
|
|
66 |
T_NUM(0), T_KWD("do"), T_LPAREN, T_ID("temp"), T_OP(":="),
|
|
67 |
T_ID("minus2"), T_SEMI, T_ID("minus2"), T_OP(":="), T_ID("minus1"),
|
|
68 |
T_OP("+"), T_ID("minus2"), T_SEMI, T_ID("minus1"), T_OP(":="),
|
|
69 |
T_ID("temp"), T_SEMI, T_ID("n"), T_OP(":="), T_ID("n"), T_OP("-"),
|
|
70 |
T_NUM(1), T_RPAREN, T_SEMI, T_KWD("write"), T_STR("Result"), T_SEMI,
|
|
71 |
T_KWD("write"), T_ID("minus2"))
|
|
72 |
|
|
73 |
|
|
74 |
|
|
75 |
// Factors program
|
|
76 |
//=================
|
|
77 |
|
|
78 |
/*
|
|
79 |
write "Input n please";
|
|
80 |
read n;
|
|
81 |
write "The factors of n are";
|
|
82 |
f := 2;
|
|
83 |
while n != 1 do {
|
|
84 |
while (n / f) * f == n do {
|
|
85 |
write f;
|
|
86 |
n := n / f
|
|
87 |
};
|
|
88 |
f := f + 1
|
|
89 |
}
|
|
90 |
*/
|
|
91 |
|
|
92 |
val factors =
|
|
93 |
List(T_KWD("write"), T_STR("Input n please"), T_SEMI, T_KWD("read"),
|
|
94 |
T_ID("n"), T_SEMI, T_KWD("write"), T_STR("The factors of n are"),
|
|
95 |
T_SEMI, T_ID("f"), T_OP(":="), T_NUM(2), T_SEMI, T_KWD("while"),
|
|
96 |
T_ID("n"), T_OP("!="), T_NUM(1), T_KWD("do"), T_LPAREN,
|
|
97 |
T_KWD("while"), T_ID("n"), T_OP("/"), T_ID("f"), T_OP("*"),
|
|
98 |
T_ID("f"), T_OP("=="), T_ID("n"), T_KWD("do"), T_LPAREN,
|
|
99 |
T_KWD("write"), T_ID("f"), T_SEMI, T_ID("n"), T_OP(":="),
|
|
100 |
T_ID("n"), T_OP("/"), T_ID("f"), T_RPAREN, T_SEMI, T_ID("f"),
|
|
101 |
T_OP(":="), T_ID("f"), T_OP("+"), T_NUM(1), T_RPAREN)
|
|
102 |
|
|
103 |
|
|
104 |
// Primes program
|
|
105 |
//================
|
|
106 |
|
|
107 |
/*
|
|
108 |
end := 100;
|
|
109 |
n := 2;
|
|
110 |
while (n < end) do {
|
|
111 |
f := 2;
|
|
112 |
tmp := 0;
|
|
113 |
while ((f < n / 2 + 1) && (tmp == 0)) do {
|
|
114 |
if ((n / f) * f == n) then { tmp := 1 } else { skip };
|
|
115 |
f := f + 1
|
|
116 |
};
|
|
117 |
if (tmp == 0) then { write(n) } else { skip };
|
|
118 |
n := n + 1
|
|
119 |
}
|
|
120 |
*/
|
|
121 |
|
|
122 |
val primes =
|
|
123 |
List(T_ID("end"), T_OP(":="), T_NUM(100), T_SEMI, T_ID("n"), T_OP(":="),
|
|
124 |
T_NUM(2), T_SEMI, T_KWD("while"), T_ID("n"), T_OP("<"), T_ID("end"),
|
|
125 |
T_KWD("do"), T_LPAREN, T_ID("f"), T_OP(":="), T_NUM(2), T_SEMI,
|
|
126 |
T_ID("tmp"), T_OP(":="), T_NUM(0), T_SEMI, T_KWD("while"), T_ID("f"),
|
|
127 |
T_OP("<"), T_ID("n"), T_OP("/"), T_NUM(2), T_OP("+"), T_NUM(1),
|
|
128 |
T_OP("&&"), T_ID("tmp"), T_OP("=="), T_NUM(0), T_KWD("do"), T_LPAREN,
|
|
129 |
T_KWD("if"), T_ID("n"), T_OP("/"), T_ID("f"), T_OP("*"), T_ID("f"),
|
|
130 |
T_OP("=="), T_ID("n"), T_KWD("then"), T_LPAREN, T_ID("tmp"), T_OP(":="),
|
|
131 |
T_NUM(1), T_RPAREN, T_KWD("else"), T_LPAREN, T_KWD("skip"), T_RPAREN,
|
|
132 |
T_SEMI, T_ID("f"), T_OP(":="), T_ID("f"), T_OP("+"), T_NUM(1),
|
|
133 |
T_RPAREN, T_SEMI, T_KWD("if"), T_ID("tmp"), T_OP("=="), T_NUM(0),
|
|
134 |
T_KWD("then"), T_LPAREN, T_KWD("write"), T_ID("n"), T_RPAREN,
|
|
135 |
T_KWD("else"), T_LPAREN, T_KWD("skip"), T_RPAREN, T_SEMI, T_ID("n"),
|
|
136 |
T_OP(":="), T_ID("n"), T_OP("+"), T_NUM(1), T_RPAREN)
|