Mercurial > projects > dil
annotate trunk/src/dil/Semantics.d @ 580:fa6d3c52757d
Moved SyntaxTree.d to new package 'ast'.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 05 Jan 2008 17:49:55 +0100 |
parents | c4bb948e5cc1 |
children |
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 +/ |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module dil.Semantics; |
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; |
559
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 import dil.Expressions; |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 import dil.Token; |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 import dil.Scope; |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 import dil.IdTable; |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 import common; |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 /// Common semantics for pragma declarations and statements. |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 void pragmaSemantic(Scope scop, Token* pragmaLoc, |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 Identifier* ident, |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 Expression[] args) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 if (ident is Ident.msg) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 pragma_msg(scop, pragmaLoc, args); |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
21 else if (ident is Ident.lib) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
22 pragma_lib(scop, pragmaLoc, args); |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
23 // else |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 // scop.error(begin, "unrecognized pragma"); |
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 |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 /// Evaluates a msg pragma. |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 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
|
29 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 if (args.length == 0) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 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
|
32 |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 foreach (arg; args) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 auto e = arg.evaluate(); |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 if (e is null) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 // 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
|
39 } |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 else if (auto stringExpr = TryCast!(StringExpression)(e)) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 // Print string to standard output. |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 Stdout(stringExpr.getString()); |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 else |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 // 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
|
46 } |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 } |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 // Print a newline at the end. |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
49 Stdout('\n'); |
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 |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 /// Evaluates a lib pragma. |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 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
|
54 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 if (args.length != 1) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
56 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
|
57 |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 auto e = args[0].evaluate(); |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 if (e is null) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
60 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
61 // 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
|
62 } |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
63 else if (auto stringExpr = TryCast!(StringExpression)(e)) |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
64 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 // TODO: collect library paths in Module? |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
66 // scop.modul.addLibrary(stringExpr.getString()); |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
67 } |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 else |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
69 { |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
70 // 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
|
71 } |
c4bb948e5cc1
Added semantic code for pragmas.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 } |