changeset 802:f51305056196

Added modules related to type rules.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Wed, 05 Mar 2008 15:45:54 +0100
parents c39667f1e814
children cb8040538772
files trunk/src/TypeRules.d trunk/src/TypeRulesData.d trunk/src/TypeRulesGenerator.d trunk/src/config.d
diffstat 4 files changed, 211 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/TypeRules.d	Sat Mar 01 20:14:56 2008 +0200
+++ b/trunk/src/TypeRules.d	Wed Mar 05 15:45:54 2008 +0100
@@ -4,22 +4,10 @@
 +/
 module TypeRules;
 
-import common;
+import cmd.Generate : xml_escape;
 
-template ExpressionType(char[] T1, char[] T2, char[] expression)
-{
-  mixin("alias "~T1~" X;");
-  mixin("alias "~T2~" Y;");
-  X x;
-  Y y;
-  static if(is(typeof(mixin(expression)) ResultType))
-    const char[] result = ResultType.stringof;
-  else
-    const char[] result = "Error";
-}
-alias ExpressionType EType;
-
-// pragma(msg, EType!("char", "int", "&x").result);
+import TypeRulesData;
+import common;
 
 static const string[] basicTypes = [
   "char"[],   "wchar",   "dchar", "bool",
@@ -72,100 +60,63 @@
   "x,y"
 ];
 
-char[] genBinaryExpArray(char[] expression)
-{
-  char[] result = "[\n";
-  foreach (t1; basicTypes)
-  {
-    result ~= "[\n";
-    foreach (t2; basicTypes)
-      result ~= `EType!("`~t1~`", "`~t2~`", "`~expression~`").result,`\n;
-    result[result.length-2] = ']'; // Overwrite last comma.
-    result[result.length-1] = ','; // Overwrite last \n.
-  }
-  result[result.length-1] = ']'; // Overwrite last comma.
-  return result;
-}
-// pragma(msg, mixin(genBinaryExpArray("x%y")).stringof);
-
-char[] genBinaryExpsArray()
-{
-  char[] result = "[\n";
-  foreach (expression; binaryExpressions[0..42])
-  {
-//     pragma(msg, "asd");
-    result ~= genBinaryExpArray(expression)/+ ~ ",\n"+/;
-    result ~= ",\n";
-  }
-  result[result.length-2] = ']';
-  return result;
-}
-
-// pragma(msg, mixin(genBinaryExpsArray()).stringof);
-
-char[] genUnaryExpArray(char[] expression)
-{
-  char[] result = "[\n";
-  foreach (t1; basicTypes)
-    result ~= `EType!("`~t1~`", "int", "`~expression~`").result,`\n;
-  result[result.length-2] = ']'; // Overwrite last comma.
-  return result;
-}
-
-char[] genUnaryExpsArray()
-{
-  char[] result = "[\n";
-  foreach (expression; unaryExpressions)
-    result ~= genUnaryExpArray(expression) ~ ",\n";
-  result[result.length-2] = ']';
-  return result;
-}
-
-// pragma(msg, mixin(genUnaryExpsArray()).stringof);
-
 void genHTMLTypeRulesTables()
 {
-  auto unaryExpsResults = mixin(genUnaryExpsArray());
-//   auto binaryExpsResults = mixin(genBinaryExpsArray());
-
   Stdout(
     `<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">`\n
     `<html>`\n
     `<head>`\n
     `  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">`\n
     `  <link href="" rel="stylesheet" type="text/css">`\n
+    `  <style type="text/css">`\n
+    `    .E { color: darkred; } /* Error */`\n
+    `    .R { font-size: 0.8em; } /* Result */`\n
+    `    .X { color: darkorange; }`\n
+    `    .Y { color: darkblue; }`\n
+    `  </style>`\n
     `</head>`\n
     `<body>`\n
+    `<p>These tables show what the type results of certain expressions are.</p>`\n
   );
 
-  Stdout.format("<table>\n<tr><th colspan=\"{}\">Unary Expressions</th></tr>", unaryExpressions.length);
+  Stdout.format("<table>\n<tr><th colspan=\"{}\">Unary Expressions</th></tr>\n", unaryExpressions.length);
   Stdout("<tr><td><!--typecol--></td>");
   foreach (unaryExpression; unaryExpressions)
-    Stdout.format("<td>{}</td>", unaryExpression);
+    Stdout.format("<td>{}</td>", {
+      if (unaryExpression[0] == 'x')
+        return `<span class="X">x</span>` ~ xml_escape(unaryExpression[1..$]);
+      else
+        return xml_escape(unaryExpression[0..$-1]) ~ `<span class="X">x</span>`;
+    }());
   Stdout("</tr>\n");
   foreach (i, basicType; basicTypes)
   {
-    Stdout.format("<tr>\n<td>{}</td>", basicType);
-    foreach (unaryExpResults; unaryExpsResults)
+    Stdout.format("<tr>\n"`<td class="X">{}</td>`, basicType);
+    foreach (expResults; unaryExpsResults)
     {
-      assert(unaryExpResults.length == basicTypes.length);
-      Stdout.format("<td>{}</td>", unaryExpResults[i]);
+      auto result =  expResults[i];
+      Stdout.format(`<td class="R">{}</td>`, result[0] == 'E' ? `<span class="E">Error</span>`[] : result);
     }
     Stdout("\n<tr>\n");
   }
   Stdout("</table>\n");
 
-  foreach (binaryExpression; binaryExpressions)
+  foreach (i, expResults; binaryExpsResults)
   {
-    Stdout.format("<table>\n<tr><th colspan=\"{}\">Binary Expression</th></tr>", basicTypes.length);
-    Stdout.format("<tr><td>{}</td>", binaryExpression);
+    auto binaryExpression = binaryExpressions[i];
+    binaryExpression = `<span class="X">x</span> ` ~
+                       xml_escape(binaryExpression[1..$-1]) ~
+                       ` <span class="Y">y</span>`;
+    Stdout.format("<table>\n<tr><th colspan=\"{}\">{}</th></tr>\n", basicTypes.length, binaryExpression);
+    Stdout.format("<tr><td><!--typecol--></td>");
+    foreach (basicType; basicTypes)
+      Stdout.format(`<td class="Y">{}</td>`, basicType);
     Stdout("\n<tr>\n");
-    foreach (i, basicType; basicTypes)
+    foreach (j, results; expResults)
     {
-      Stdout.format("<tr>\n<td>{}</td>", basicType);
-//       foreach (basicType; basicTypes)
-      {
-      }
+      Stdout.format("<tr>\n"`<td class="X">{}</td>`, basicTypes[j]);
+      foreach (result; results)
+        Stdout.format(`<td class="R">{}</td>`, result[0] == 'E' ? `<span class="E">Error</span>`[] : result);
       Stdout("\n<tr>\n");
     }
     Stdout("</table>\n");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/TypeRulesData.d	Wed Mar 05 15:45:54 2008 +0100
@@ -0,0 +1,1 @@
+// Run TypeRulesGenerator.d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/TypeRulesGenerator.d	Wed Mar 05 15:45:54 2008 +0100
@@ -0,0 +1,174 @@
+#! /usr/bin/rdmd
+/++
+  Author: Aziz Köksal
+  License: GPL3
++/
+module TypeRulesGenerator;
+
+import tango.io.File;
+import tango.io.FilePath;
+
+alias char[] string;
+
+void main(char[][] args)
+{
+  char[] text = "// Generated by TypeRulesGenerator.d\n"
+                "module TypeRules.d;\n\n";
+  text ~= "char[][][] unaryExpsResults = [\n";
+  foreach (results; unaryExpsResults)
+  {
+    text ~= "  [";
+    foreach (result; results)
+      text ~= '"' ~ result ~ '"' ~ ", ";
+    text[$-2] = ']';
+    text[$-1] = ',';
+    text ~= \n;
+  }
+  text[$-2] = '\n';
+  text[$-1] = ']';
+  text ~= ";\n\n";
+
+  text ~= "char[][][][] binaryExpsResults = [\n";
+  foreach (expResults; binaryExpsResults)
+  {
+    text ~= "  [\n";
+    foreach (results; expResults)
+    {
+      text ~= "    [";
+      foreach (result; results)
+        text ~= '"' ~ result ~ '"' ~ ", ";
+      text[$-2] = ']';
+      text[$-1] = ',';
+      text ~= \n;
+    }
+    text[$-2] = '\n';
+    text[$-1] = ' ';
+    text ~= " ],\n";
+  }
+  text[$-2] = '\n';
+  text[$-1] = ']';
+  text ~= ";\n";
+
+  // Write the text to a D module.
+  auto file = new File("TypeRulesData.d");
+  file.write(text);
+}
+
+template ExpressionType(char[] T1, char[] T2, char[] expression)
+{
+  mixin("alias "~T1~" X;");
+  mixin("alias "~T2~" Y;");
+  X x;
+  Y y;
+  static if(is(typeof(mixin(expression)) ResultType))
+    const char[] result = ResultType.stringof;
+  else
+    const char[] result = "Error";
+}
+alias ExpressionType EType;
+
+// pragma(msg, EType!("char", "int", "&x").result);
+
+static const string[] basicTypes = [
+  "char"[],   "wchar",   "dchar", "bool",
+  "byte",   "ubyte",   "short", "ushort",
+  "int",    "uint",    "long",  "ulong",
+  /+"cent",   "ucent",+/
+  "float",  "double",  "real",
+  "ifloat", "idouble", "ireal",
+  "cfloat", "cdouble", "creal"/+, "void"+/
+];
+
+static const string[] unaryExpressions = [
+  "!x",
+  "&x",
+  "~x",
+  "+x",
+  "-x",
+  "++x",
+  "--x",
+  "x++",
+  "x--",
+];
+
+static const string[] binaryExpressions = [
+  "x!<>=y",
+  "x!<>y",
+  "x!<=y",
+  "x!<y",
+  "x!>=y",
+  "x!>y",
+  "x<>=y",
+  "x<>y",
+
+  "x=y", "x==y", "x!=y",
+  "x<=y", "x<y",
+  "x>=y", "x>y",
+  "x<<=y", "x<<y",
+  "x>>=y","x>>y",
+  "x>>>=y", "x>>>y",
+  "x|=y", "x||y", "x|y",
+  "x&=y", "x&&y", "x&y",
+  "x+=y", "x+y",
+  "x-=y", "x-y",
+  "x/=y", "x/y",
+  "x*=y", "x*y",
+  "x%=y", "x%y",
+  "x^=y", "x^y",
+  "x~=y",
+  "x~y",
+  "x,y"
+];
+
+char[] genBinaryExpArray(char[] expression)
+{
+  char[] result = "[\n";
+  foreach (t1; basicTypes)
+  {
+    result ~= "[\n";
+    foreach (t2; basicTypes)
+      result ~= `EType!("`~t1~`", "`~t2~`", "`~expression~`").result,`\n;
+    result[result.length-2] = ']'; // Overwrite last comma.
+    result[result.length-1] = ','; // Overwrite last \n.
+  }
+  result[result.length-1] = ']'; // Overwrite last comma.
+  return result;
+}
+// pragma(msg, mixin(genBinaryExpArray("x%y")).stringof);
+
+char[] genBinaryExpsArray()
+{
+  char[] result = "[\n";
+  foreach (expression; binaryExpressions)
+  {
+    result ~= genBinaryExpArray(expression);
+    result ~= ",\n";
+  }
+  result[result.length-2] = ']';
+  return result;
+}
+
+// pragma(msg, mixin(genBinaryExpsArray()).stringof);
+
+char[] genUnaryExpArray(char[] expression)
+{
+  char[] result = "[\n";
+  foreach (t1; basicTypes)
+    result ~= `EType!("`~t1~`", "int", "`~expression~`").result,`\n;
+  result[result.length-2] = ']'; // Overwrite last comma.
+  return result;
+}
+
+char[] genUnaryExpsArray()
+{
+  char[] result = "[\n";
+  foreach (expression; unaryExpressions)
+    result ~= genUnaryExpArray(expression) ~ ",\n";
+  result[result.length-2] = ']';
+  return result;
+}
+
+// pragma(msg, mixin(genUnaryExpsArray()).stringof);
+
+auto unaryExpsResults = mixin(genUnaryExpsArray());
+auto binaryExpsResults = mixin(genBinaryExpsArray());
--- a/trunk/src/config.d	Sat Mar 01 20:14:56 2008 +0200
+++ b/trunk/src/config.d	Wed Mar 05 15:45:54 2008 +0100
@@ -14,6 +14,8 @@
 var import_paths = []; /// E.g.: ["src/", "import/"]
 
 /// DDoc macro file paths.
+///
+/// Macro definitions in ddoc_files[n] override the ones in ddoc_files[n-1].
 var ddoc_files = ["predefined.ddoc"]; /// E.g.: ["src/mymacros.ddoc", "othermacros.ddoc"]
 
 var xml_map = "xml_map.d";