diff parser/Parser.d @ 140:927ae00bd9d2

Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
author Anders Johnsen <skabet@gmail.com>
date Sun, 20 Jul 2008 23:23:56 +0200
parents 2be29b296081
children d76cc5cad4fc
line wrap: on
line diff
--- a/parser/Parser.d	Fri Jul 11 21:47:57 2008 +0200
+++ b/parser/Parser.d	Sun Jul 20 23:23:56 2008 +0200
@@ -117,6 +117,10 @@
                 case Tok.Auto:
                     a.setAuto;
                     break;
+                case Tok.Extern:
+                    Extern e = parseLinkageType;
+                    a.setExtern(e);
+                    break;
             }
             if(sco)
             {
@@ -196,6 +200,45 @@
             .fatal(ExitLevel.Parser);
     }
 
+    Extern parseLinkageType()
+    {
+        Extern e = Extern.D;
+        if(lexer.peek(1).type != Tok.OpenParentheses)
+            return e;
+
+        lexer.next; lexer.next;
+
+        Token t = require(Tok.Identifier);
+
+        switch(sm.getText(t.asRange))
+        {
+            case "C":
+                if (lexer.peek(0).type == Tok.Plus && 
+                    lexer.peek(1).type == Tok.Plus)
+                    e = Extern.CPlusPlus;
+                else
+                    e = Extern.C;
+                break;
+            case "D":
+                break;
+            case "Windows":
+                e = Extern.Windows;
+                break;
+            case "Pascal":
+                e = Extern.Pascal;
+                break;
+            case "System":
+                e = Extern.System;
+                break;
+            default:
+                messages.report(UnexpectedLinkType, t.location);
+        }
+
+        require(Tok.CloseParentheses);
+        
+        return e;
+    }
+
     /**
       Parse a series of imports belonging to a single import token.
      */