diff trunk/src/main.d @ 306:9c866aadcb5b

- Moved code out of main() to separate functions. - Added compiler version info and main help message.
author aziz
date Tue, 14 Aug 2007 17:53:03 +0000
parents df237b3b5f09
children 5f6a173d4ad3
line wrap: on
line diff
--- a/trunk/src/main.d	Tue Aug 14 12:18:01 2007 +0000
+++ b/trunk/src/main.d	Tue Aug 14 17:53:03 2007 +0000
@@ -9,25 +9,54 @@
 import Messages;
 import std.stdio;
 import std.file;
+import std.metastrings;
 
-char[] xmlescape(char[] text)
+import Declarations, SyntaxTree;
+
+version(D2)
+{
+  const VERSION_MAJOR = 2;
+  const VERSION_MINOR = 0;
+}
+else
 {
-  char[] result;
-  foreach(c; text)
-    switch(c)
-    {
-      case '<': result ~= "&lt;";  break;
-      case '>': result ~= "&gt;";  break;
-      case '&': result ~= "&amp;"; break;
-      default:  result ~= c;
-    }
-  return result;
+  const VERSION_MAJOR = 1;
+  const VERSION_MINOR = 0;
 }
-import Declarations, SyntaxTree;
+const string VERSION = Format!("%s.%s", VERSION_MAJOR, VERSION_MINOR);
+
+const char[] usageHighlight = "highlight (hl) file.d";
+const string helpMain = `dil v`~VERSION~`
+Copyright (c) 2007 by Aziz Köksal
+
+Subcommands:
+  `~usageHighlight~`
+
+Type 'dil help <subcommand>' for more help on a particular subcommand.
+
+Compiled with `~__VENDOR__~` `~Format!("v%s.%s", __VERSION__/1000, __VERSION__%1000)~` on `~__TIMESTAMP__~`.
+`;
+
 void main(char[][] args)
 {
-  auto srctext = cast(char[]) std.file.read(args[1]);
-  auto parser = new Parser(srctext, args[1]);
+  if (args.length <= 1)
+    return writefln(helpMain);
+
+  string command = args[1];
+  switch (command)
+  {
+  case "hl", "highlight":
+    if (args.length == 3)
+      highlightTokens(args[2]);
+    break;
+  default:
+  }
+}
+
+void parse(string fileName)
+{
+  auto sourceText = cast(char[]) std.file.read(fileName);
+  auto parser = new Parser(sourceText, fileName);
   parser.start();
   auto root = parser.parseModule();
 
@@ -45,111 +74,137 @@
 {
   writefln(`%s(%d)P: %s`, parser.lx.fileName, error.loc, error.getMsg);
 }
-std.c.stdlib.exit(0);
+}
 
-  auto lx = new Lexer(srctext, args[1]);
+char[] xml_escape(char[] text)
+{
+  char[] result;
+  foreach(c; text)
+    switch(c)
+    {
+      case '<': result ~= "&lt;";  break;
+      case '>': result ~= "&gt;";  break;
+      case '&': result ~= "&amp;"; break;
+      default:  result ~= c;
+    }
+  return result;
+}
 
-  auto tokens = lx.getTokens();
+void highlightTokens(string fileName)
+{
+  auto sourceText = cast(char[]) std.file.read(fileName);
+  auto lx = new Lexer(sourceText, fileName);
+
+  auto token = lx.getTokens();
   char* end = lx.text.ptr;
 
-  writef(`<?xml version="1.0"?>
-<?xml-stylesheet href="format.css" type="text/css"?>
-<root>
-<compilerinfo>`\n);
-  foreach (error; lx.errors)
+  writef(`<?xml version="1.0"?>`
+         `<?xml-stylesheet href="format.css" type="text/css"?>`
+         `<root>`);
+  if (lx.errors.length)
   {
-    writefln(`<error t="%s">%s(%d): %s</error>`, "l", lx.fileName, error.loc, error.getMsg);
+    writefln("<compilerinfo>");
+    foreach (error; lx.errors)
+    {
+      writefln(`<error t="%s">%s(%d): %s</error>`, "l", lx.fileName, error.loc, xml_escape(error.getMsg));
+    }
+    writefln("</compilerinfo>");
   }
-  writef(`</compilerinfo>
-<sourcetext>`);
-  foreach (ref token; tokens)
+  writef(`<sourcetext>`);
+
+  // Traverse linked list and print tokens.
+  while (token.type != TOK.EOF)
   {
+    token = token.next;
+
+    // Print whitespace between previous and current token.
     if (end != token.start)
-      writef("%s", xmlescape(end[0 .. token.start - end]));
-    string srcText = xmlescape(token.srcText);
+      writef("%s", xml_escape(end[0 .. token.start - end]));
+
+    string srcText = xml_escape(token.srcText);
+
     switch(token.type)
     {
-      case TOK.Identifier:
-        writef("<i>%s</i>", srcText);
+    case TOK.Identifier:
+      writef("<i>%s</i>", srcText);
       break;
-      case TOK.Comment:
-        string c;
-        switch (token.start[1])
-        {
-        case '/': c = "lc"; break;
-        case '*': c = "bc"; break;
-        case '+': c = "nc"; break;
-        default:
-          assert(0);
-        }
-        writef(`<c c="%s">%s</c>`, c, srcText);
+    case TOK.Comment:
+      string c;
+      switch (token.start[1])
+      {
+      case '/': c = "l"; break;
+      case '*': c = "b"; break;
+      case '+': c = "n"; break;
+      default:
+        assert(0);
+      }
+      writef(`<c c="%s">%s</c>`, c, srcText);
       break;
-      case TOK.String:
-        writef("<sl>%s</sl>", srcText);
+    case TOK.String:
+      writef("<sl>%s</sl>", srcText);
       break;
-      case TOK.CharLiteral, TOK.WCharLiteral, TOK.DCharLiteral:
-        writef("<cl>%s</cl>", srcText);
+    case TOK.CharLiteral, TOK.WCharLiteral, TOK.DCharLiteral:
+      writef("<cl>%s</cl>", srcText);
       break;
-      case TOK.Assign, TOK.Equal,
-        TOK.Less, TOK.Greater,
-        TOK.LShiftAssign, TOK.LShift,
-        TOK.RShiftAssign, TOK.RShift,
-        TOK.URShiftAssign, TOK.URShift,
-        TOK.OrAssign, TOK.OrBinary,
-        TOK.AndAssign, TOK.AndBinary,
-        TOK.PlusAssign, TOK.PlusPlus, TOK.Plus,
-        TOK.MinusAssign, TOK.MinusMinus, TOK.Minus,
-        TOK.DivAssign, TOK.Div,
-        TOK.MulAssign, TOK.Mul,
-        TOK.ModAssign, TOK.Mod,
-        TOK.XorAssign, TOK.Xor,
-        TOK.CatAssign, TOK.Catenate,
-        TOK.Tilde,
-        TOK.Unordered,
-        TOK.UorE,
-        TOK.UorG,
-        TOK.UorGorE,
-        TOK.UorL,
-        TOK.UorLorE,
-        TOK.LorEorG:
-        writef("<op>%s</op>", srcText);
+    case TOK.Assign, TOK.Equal,
+         TOK.Less, TOK.Greater,
+         TOK.LShiftAssign, TOK.LShift,
+         TOK.RShiftAssign, TOK.RShift,
+         TOK.URShiftAssign, TOK.URShift,
+         TOK.OrAssign, TOK.OrBinary,
+         TOK.AndAssign, TOK.AndBinary,
+         TOK.PlusAssign, TOK.PlusPlus, TOK.Plus,
+         TOK.MinusAssign, TOK.MinusMinus, TOK.Minus,
+         TOK.DivAssign, TOK.Div,
+         TOK.MulAssign, TOK.Mul,
+         TOK.ModAssign, TOK.Mod,
+         TOK.XorAssign, TOK.Xor,
+         TOK.CatAssign, TOK.Catenate,
+         TOK.Tilde,
+         TOK.Unordered,
+         TOK.UorE,
+         TOK.UorG,
+         TOK.UorGorE,
+         TOK.UorL,
+         TOK.UorLorE,
+         TOK.LorEorG:
+      writef("<op>%s</op>", srcText);
       break;
-      case TOK.LorG:
-        writef(`<op c="lg">&lt;&gt;</op>`);
+    case TOK.LorG:
+      writef(`<op c="lg">&lt;&gt;</op>`);
       break;
-      case TOK.LessEqual:
-        writef(`<op c="le">&lt;=</op>`);
+    case TOK.LessEqual:
+      writef(`<op c="le">&lt;=</op>`);
       break;
-      case TOK.GreaterEqual:
-        writef(`<op c="ge">&gt;=</op>`);
+    case TOK.GreaterEqual:
+      writef(`<op c="ge">&gt;=</op>`);
       break;
-      case TOK.AndLogical:
-        writef(`<op c="aa">&amp;&amp;</op>`);
+    case TOK.AndLogical:
+      writef(`<op c="aa">&amp;&amp;</op>`);
       break;
-      case TOK.OrLogical:
-        writef(`<op c="oo">||</op>`);
+    case TOK.OrLogical:
+      writef(`<op c="oo">||</op>`);
       break;
-      case TOK.NotEqual:
-        writef(`<op c="ne">!=</op>`);
+    case TOK.NotEqual:
+      writef(`<op c="ne">!=</op>`);
       break;
-      case TOK.Not:
-        writef(`<op c="n">!</op>`);
+    case TOK.Not:
+      writef(`<op c="n">!</op>`);
       break;
-      case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64,
-           TOK.Float32, TOK.Float64, TOK.Float80,
-           TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80:
-        writef("<n>%s</n>", srcText);
+    case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64,
+          TOK.Float32, TOK.Float64, TOK.Float80,
+          TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80:
+      writef("<n>%s</n>", srcText);
       break;
-      case TOK.LParen, TOK.RParen, TOK.LBracket,
-           TOK.RBracket, TOK.LBrace, TOK.RBrace:
-        writef("<br>%s</br>", srcText);
+    case TOK.LParen, TOK.RParen, TOK.LBracket,
+          TOK.RBracket, TOK.LBrace, TOK.RBrace:
+      writef("<br>%s</br>", srcText);
       break;
-      case TOK.EOF: break;
-      default:
-        if (token.isKeyword())
-          writef("<k>%s</k>", srcText);
-        else
-          writef("%s", srcText);
+    default:
+      if (token.isKeyword())
+        writef("<k>%s</k>", srcText);
+      else
+        writef("%s", srcText);
     }
     end = token.end;
   }