forked from nim-works/phy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsyntax_source.nim
83 lines (67 loc) · 2.25 KB
/
syntax_source.nim
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
## Provides the type definitions for the source languages.
# XXX: this module is going be auto-generated by the passtool in the future
import
experimental/sexp,
passes/trees,
vm/utils
type
NodeKind* {.pure.} = enum
IntVal, FloatVal, StringVal
Ident,
VoidTy, UnitTy, BoolTy, CharTy, IntTy, FloatTy, TupleTy, UnionTy, ProcTy,
SeqTy
And, Or
If
While
Call
TupleCons
Seq
FieldAccess, At
As
Exprs
Asgn
Return
Unreachable
Params
ProcDecl, ParamDecl
Decl
TypeDecl
Module
Node = TreeNode[NodeKind]
const
ExprNodes* = {IntVal, FloatVal, Ident, And, Or, If, While, Call, TupleCons,
Seq, FieldAccess, At, As, Asgn, Return, Unreachable, Exprs,
Decl}
DeclNodes* = {ProcDecl, TypeDecl}
AllNodes* = {low(NodeKind) .. high(NodeKind)}
using
lit: var Literals
template isAtom*(x: NodeKind): bool =
ord(x) <= ord(Ident)
proc toSexp*(tree: PackedTree[NodeKind], idx: NodeIndex,
n: TreeNode[NodeKind]): SexpNode =
case n.kind
of IntVal: sexp([newSSymbol("IntVal"), sexp tree.getInt(idx)])
of FloatVal: sexp([newSSymbol("FloatVal"), sexp tree.getFloat(idx)])
of StringVal: sexp([newSSymbol("StringVal"), sexp tree.getString(idx)])
of Ident: sexp([newSSymbol("Ident"), sexp tree.getString(idx)])
else: unreachable()
proc fromSexp*(kind: NodeKind): Node =
raise ValueError.newException($kind & " node is missing operand")
proc fromSexp*(kind: NodeKind, val: BiggestInt, lit): Node =
assert kind == IntVal
Node(kind: kind, val: lit.pack(val))
proc fromSexp*(kind: NodeKind, val: BiggestFloat, lit): Node =
assert kind == FloatVal
Node(kind: kind, val: lit.pack(val))
proc fromSexp*(kind: NodeKind, val: string, lit): Node =
assert kind == Ident
Node(kind: kind, val: lit.pack(val))
proc fromSexp*(_: typedesc[NodeKind], val: BiggestInt, lit): Node =
Node(kind: IntVal, val: lit.pack(val))
proc fromSexp*(_: typedesc[NodeKind], val: BiggestFloat, lit): Node =
Node(kind: FloatVal, val: lit.pack(val))
proc fromSexp*(_: typedesc[NodeKind], val: string, lit): Node =
Node(kind: StringVal, val: lit.pack(val))
proc fromSexpSym*(_: typedesc[NodeKind], val: string, lit): Node =
Node(kind: Ident, val: lit.pack(val))