annotate trunk/src/dil/semantic/Analysis.d @ 601:9f96fd51cb41

Moved dil.IdTable to dil.lexer.IdTable.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sun, 06 Jan 2008 00:55:37 +0100
parents 39fac5531b85
children 64fec49651cf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
1 /++
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
2 Author: Aziz Köksal
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
3 License: GPL3
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
4 +/
583
af16adf500f4 Moved dil.Semantics to dil.semantic.Analysis.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 580
diff changeset
5 module dil.semantic.Analysis;
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
6
580
fa6d3c52757d Moved SyntaxTree.d to new package 'ast'.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 559
diff changeset
7 import dil.ast.Node;
586
e25345656d10 Moved dil.Expressions to dil.ast.Expressions.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 583
diff changeset
8 import dil.ast.Expressions;
592
b8dd677e0ace Moved dil.Scope to dil.semantic.Scope.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 586
diff changeset
9 import dil.semantic.Scope;
601
9f96fd51cb41 Moved dil.IdTable to dil.lexer.IdTable.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 596
diff changeset
10 import dil.lexer.IdTable;
559
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
11 import common;
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
12
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
13 /// Common semantics for pragma declarations and statements.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
14 void pragmaSemantic(Scope scop, Token* pragmaLoc,
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
15 Identifier* ident,
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
16 Expression[] args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
17 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
18 if (ident is Ident.msg)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
19 pragma_msg(scop, pragmaLoc, args);
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
20 else if (ident is Ident.lib)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
21 pragma_lib(scop, pragmaLoc, args);
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
22 // else
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
23 // scop.error(begin, "unrecognized pragma");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
24 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
25
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
26 /// Evaluates a msg pragma.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
27 void pragma_msg(Scope scop, Token* pragmaLoc, Expression[] args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
28 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
29 if (args.length == 0)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
30 return /*scop.error(pragmaLoc, "expected expression arguments to pragma")*/;
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
31
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
32 foreach (arg; args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
33 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
34 auto e = arg.evaluate();
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
35 if (e is null)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
36 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
37 // scop.error(e.begin, "expression is not evaluatable at compile time");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
38 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
39 else if (auto stringExpr = TryCast!(StringExpression)(e))
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
40 // Print string to standard output.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
41 Stdout(stringExpr.getString());
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
42 else
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
43 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
44 // scop.error(e.begin, "expression must evaluate to a string");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
45 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
46 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
47 // Print a newline at the end.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
48 Stdout('\n');
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
49 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
50
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
51 /// Evaluates a lib pragma.
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
52 void pragma_lib(Scope scop, Token* pragmaLoc, Expression[] args)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
53 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
54 if (args.length != 1)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
55 return /*scop.error(pragmaLoc, "expected one expression argument to pragma")*/;
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
56
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
57 auto e = args[0].evaluate();
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
58 if (e is null)
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
59 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
60 // scop.error(e.begin, "expression is not evaluatable at compile time");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
61 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
62 else if (auto stringExpr = TryCast!(StringExpression)(e))
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
63 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
64 // TODO: collect library paths in Module?
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
65 // scop.modul.addLibrary(stringExpr.getString());
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
66 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
67 else
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
68 {
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
69 // scop.error(e.begin, "expression must evaluate to a string");
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
70 }
c4bb948e5cc1 Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
71 }