* allow full commands and blocks in type sections * update grammar * fix changelog [skip ci] * more tests * even more tests
328 lines
5 KiB
Nim
328 lines
5 KiB
Nim
discard """
|
|
nimout: '''
|
|
StmtList
|
|
TypeSection
|
|
TypeDef
|
|
Ident "A"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
IntLit 1
|
|
TypeSection
|
|
TypeDef
|
|
Ident "B"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 2
|
|
TypeDef
|
|
Ident "C"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
StmtList
|
|
IntLit 3
|
|
TypeDef
|
|
Ident "D"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
StmtList
|
|
IntLit 4
|
|
TypeSection
|
|
TypeDef
|
|
Ident "E"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
IntLit 5
|
|
IntLit 6
|
|
TypeDef
|
|
Ident "F"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 7
|
|
IntLit 8
|
|
TypeDef
|
|
Ident "G"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
IntLit 9
|
|
StmtList
|
|
IntLit 10
|
|
TypeDef
|
|
Ident "H"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
IntLit 11
|
|
StmtList
|
|
IntLit 12
|
|
TypeDef
|
|
Ident "I"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 13
|
|
StmtList
|
|
IntLit 14
|
|
TypeDef
|
|
Ident "J"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 15
|
|
StmtList
|
|
IntLit 16
|
|
TypeSection
|
|
TypeDef
|
|
Ident "K"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
IntLit 17
|
|
IntLit 18
|
|
IntLit 19
|
|
TypeDef
|
|
Ident "L"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 20
|
|
IntLit 21
|
|
IntLit 22
|
|
TypeDef
|
|
Ident "M"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
IntLit 23
|
|
IntLit 24
|
|
StmtList
|
|
IntLit 25
|
|
TypeDef
|
|
Ident "N"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 26
|
|
IntLit 27
|
|
StmtList
|
|
IntLit 28
|
|
TypeDef
|
|
Ident "O"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 29
|
|
IntLit 30
|
|
StmtList
|
|
IntLit 31
|
|
TypeSection
|
|
TypeDef
|
|
Ident "P"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
TupleConstr
|
|
IntLit 32
|
|
IntLit 33
|
|
Infix
|
|
Ident "+"
|
|
Infix
|
|
Ident "*"
|
|
IntLit 34
|
|
IntLit 35
|
|
IntLit 36
|
|
StmtList
|
|
IntLit 37
|
|
TypeDef
|
|
Ident "R"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
Infix
|
|
Ident "@"
|
|
TupleConstr
|
|
IntLit 38
|
|
IntLit 39
|
|
Infix
|
|
Ident "shl"
|
|
IntLit 40
|
|
IntLit 41
|
|
Infix
|
|
Ident "-"
|
|
Infix
|
|
Ident "*"
|
|
IntLit 42
|
|
IntLit 43
|
|
IntLit 44
|
|
StmtList
|
|
IntLit 45
|
|
TypeDef
|
|
Ident "S"
|
|
Empty
|
|
Command
|
|
Ident "call"
|
|
IntLit 46
|
|
StmtList
|
|
IntLit 47
|
|
StmtList
|
|
IntLit 48
|
|
TypeDef
|
|
Ident "T"
|
|
Empty
|
|
Call
|
|
Ident "call"
|
|
StmtList
|
|
IntLit 49
|
|
StmtList
|
|
IntLit 50
|
|
StmtList
|
|
IntLit 51
|
|
a: IntLit 1
|
|
a: IntLit 2
|
|
a: StmtList
|
|
IntLit 3
|
|
a: StmtList
|
|
IntLit 4
|
|
a: IntLit 5
|
|
b: IntLit 6
|
|
a: IntLit 7
|
|
b: IntLit 8
|
|
a: IntLit 9
|
|
b: StmtList
|
|
IntLit 10
|
|
a: IntLit 11
|
|
b: StmtList
|
|
IntLit 12
|
|
a: IntLit 13
|
|
b: StmtList
|
|
IntLit 14
|
|
a: IntLit 15
|
|
b: StmtList
|
|
IntLit 16
|
|
a: IntLit 17
|
|
b: IntLit 18
|
|
c: IntLit 19
|
|
a: IntLit 20
|
|
b: IntLit 21
|
|
c: IntLit 22
|
|
a: IntLit 23
|
|
b: IntLit 24
|
|
c: StmtList
|
|
IntLit 25
|
|
a: IntLit 26
|
|
b: IntLit 27
|
|
c: StmtList
|
|
IntLit 28
|
|
a: IntLit 29
|
|
b: IntLit 30
|
|
c: StmtList
|
|
IntLit 31
|
|
a: TupleConstr
|
|
IntLit 32
|
|
IntLit 33
|
|
b: Infix
|
|
Ident "+"
|
|
Infix
|
|
Ident "*"
|
|
IntLit 34
|
|
IntLit 35
|
|
IntLit 36
|
|
c: StmtList
|
|
IntLit 37
|
|
a: Infix
|
|
Ident "@"
|
|
TupleConstr
|
|
IntLit 38
|
|
IntLit 39
|
|
Infix
|
|
Ident "shl"
|
|
IntLit 40
|
|
IntLit 41
|
|
b: Infix
|
|
Ident "-"
|
|
Infix
|
|
Ident "*"
|
|
IntLit 42
|
|
IntLit 43
|
|
IntLit 44
|
|
c: StmtList
|
|
IntLit 45
|
|
a: IntLit 46
|
|
b: StmtList
|
|
IntLit 47
|
|
c: StmtList
|
|
IntLit 48
|
|
a: StmtList
|
|
IntLit 49
|
|
b: StmtList
|
|
IntLit 50
|
|
c: StmtList
|
|
IntLit 51
|
|
'''
|
|
"""
|
|
import macros
|
|
|
|
macro call(a): untyped =
|
|
echo "a: ", a.treeRepr
|
|
result = ident"int"
|
|
macro call(a, b): untyped =
|
|
echo "a: ", a.treeRepr
|
|
echo "b: ", b.treeRepr
|
|
result = ident"int"
|
|
macro call(a, b, c): untyped =
|
|
echo "a: ", a.treeRepr
|
|
echo "b: ", b.treeRepr
|
|
echo "c: ", c.treeRepr
|
|
result = ident"int"
|
|
|
|
macro sections(x): untyped =
|
|
echo x.treeRepr
|
|
result = newStmtList(x)
|
|
for ts in x:
|
|
for td in ts:
|
|
let t = td[0]
|
|
result.add quote do:
|
|
doAssert `t` is int
|
|
|
|
sections:
|
|
type A = call(1)
|
|
type
|
|
B = call 2
|
|
C = call: 3
|
|
D = call(): 4
|
|
type
|
|
E = call(5, 6)
|
|
F = call 7, 8
|
|
G = call(9): 10
|
|
H = call(11):
|
|
12
|
|
I = call 13: 14
|
|
J = call 15:
|
|
16
|
|
type
|
|
K = call(17, 18, 19)
|
|
L = call 20, 21, 22
|
|
M = call(23, 24): 25
|
|
N = call 26, 27: 28
|
|
O = call 29, 30:
|
|
31
|
|
type
|
|
P = call (32, 33), 34 * 35 + 36:
|
|
37
|
|
R = call (38, 39) @ 40 shl 41, 42 * 43 - 44:
|
|
45
|
|
S = call 46:
|
|
47
|
|
do:
|
|
48
|
|
T = call:
|
|
49
|
|
do:
|
|
50
|
|
do:
|
|
51
|