-
-
Notifications
You must be signed in to change notification settings - Fork 594
/
printast.d
107 lines (88 loc) · 2.56 KB
/
printast.d
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/**
* Compiler implementation of the
* $(LINK2 http://www.dlang.org, D programming language).
*
* Copyright: Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved
* Authors: $(LINK2 http://www.digitalmars.com, Walter Bright)
* License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
* Source: $(LINK2 https://github.com/dlang/dmd/blob/master/src/dmd/printast.d, _printast.d)
* Documentation: https://dlang.org/phobos/dmd_printast.html
* Coverage: https://codecov.io/gh/dlang/dmd/src/master/src/dmd/printast.d
*/
module dmd.printast;
import core.stdc.stdio;
import dmd.expression;
import dmd.tokens;
import dmd.visitor;
/********************
* Print AST data structure in a nice format.
* Params:
* e = expression AST to print
* indent = indentation level
*/
void printAST(Expression e, int indent = 0)
{
scope PrintASTVisitor pav = new PrintASTVisitor(indent);
e.accept(pav);
}
private:
extern (C++) final class PrintASTVisitor : Visitor
{
alias visit = Visitor.visit;
int indent;
extern (D) this(int indent)
{
this.indent = indent;
}
override void visit(Expression e)
{
printIndent(indent);
printf("%s %s\n", Token.toChars(e.op), e.type ? e.type.toChars() : "");
}
override void visit(StructLiteralExp e)
{
printIndent(indent);
printf("%s %s, %s\n", Token.toChars(e.op), e.type ? e.type.toChars() : "", e.toChars());
}
override void visit(SymbolExp e)
{
visit(cast(Expression)e);
printIndent(indent + 2);
printf(".var: %s\n", e.var ? e.var.toChars() : "");
}
override void visit(DsymbolExp e)
{
visit(cast(Expression)e);
printIndent(indent + 2);
printf(".s: %s\n", e.s ? e.s.toChars() : "");
}
override void visit(DotIdExp e)
{
visit(cast(Expression)e);
printIndent(indent + 2);
printf(".ident: %s\n", e.ident.toChars());
printAST(e.e1, indent + 2);
}
override void visit(UnaExp e)
{
visit(cast(Expression)e);
printAST(e.e1, indent + 2);
}
override void visit(BinExp e)
{
visit(cast(Expression)e);
printAST(e.e1, indent + 2);
printAST(e.e2, indent + 2);
}
override void visit(DelegateExp e)
{
visit(cast(Expression)e);
printIndent(indent + 2);
printf(".func: %s\n", e.func ? e.func.toChars() : "");
}
static void printIndent(int indent)
{
foreach (i; 0 .. indent)
putc(' ', stdout);
}
}