-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIntrinsics.java
More file actions
55 lines (52 loc) · 2.2 KB
/
Intrinsics.java
File metadata and controls
55 lines (52 loc) · 2.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
class Intrinsics {
private static void defIntrinsic(SymbolTable symTab, String name, String typeString) {
if (symTab.contains(name)) {
ErrorPrinter.print(symTab.get(name).loc(),
"Redefinition of intrinsic '" + name + "'");
return;
}
final Reader reader = new StringReader(typeString);
final TackParser parser = new TackParser(reader, "(intrinsic)");
xtc.parser.Result result = null;
try {
result = parser.pfunType1(0);
} catch (final IOException e) {
assert false;
}
if (!result.hasValue()) {
ErrorPrinter.print(parser, result.parseError());
ErrorPrinter.exit();
}
final FunType rawTypeAst = (FunType)result.semanticValue();
final TreeNormalizer normalizer = new TreeNormalizer();
final FunType typeAst = (FunType)rawTypeAst.accept(normalizer);
final FunId id = new FunId(null, name);
final FunDef fun = new FunDef(null, id, typeAst, (BlockStmt)null);
final FunSym sym = new FunSym(symTab._current, fun);
symTab.def(sym);
}
static void defIntrinsics(SymbolTable symTab) {
defIntrinsic(symTab, "append", "(lhs: string, rhs: string)-> string");
defIntrinsic(symTab, "bool2int", "(b: bool)-> int");
defIntrinsic(symTab, "bool2string", "(b: bool)-> string");
defIntrinsic(symTab, "int2bool", "(i: int)-> bool");
defIntrinsic(symTab, "int2string", "(i: int)-> string");
defIntrinsic(symTab, "length", "(s: string)-> int");
defIntrinsic(symTab, "newArray","(eSize: int, aSize: int)-> [()]");
defIntrinsic(symTab, "newRecord", "(rSize: int)-> ()");
defIntrinsic(symTab, "print", "(s: string)-> void");
defIntrinsic(symTab, "range", "(start: int, end: int)-> [int]");
defIntrinsic(symTab, "size", "(a: [()])-> int");
defIntrinsic(symTab, "string2bool", "(s: string)-> bool");
defIntrinsic(symTab, "string2int", "(s: string)-> int");
defIntrinsic(symTab, "stringEqual", "(lhs:string, rhs:string)-> bool");
}
static FunSym get(SymbolTable symTab, String name) {
FunSym result = (FunSym)symTab._topLevel.get(name);
assert null != result : name;
return result;
}
}