]> git.mdlowis.com Git - archive/dlang.git/commitdiff
Fixed macro expansion, Cleaned up namespaces, and fixed scheme output for maps
authorMike D. Lowis <mike@mdlowis.com>
Sat, 10 Mar 2012 20:28:56 +0000 (15:28 -0500)
committerMike D. Lowis <mike@mdlowis.com>
Sat, 10 Mar 2012 20:28:56 +0000 (15:28 -0500)
example.dl
res/environment.scm
source/dlparser/dlparser.cpp
source/dlparser/macro/pattern.cpp
source/main.cpp
source/visitors/scheme/scheme.cpp
source/visitors/scheme/scheme.h

index cb5ef5726921b6c05e779ca2f4bce26671e6aae1..fd9736b20c459a2e2ed75e8c69565e178c8284fa 100644 (file)
@@ -16,16 +16,16 @@ foo = "12345"[2]
 # Symbol
 foo = $some_symbol
 
-# Id
-foo = bar
-#foo.bar = bar
-
 # Map
-#foo = {
-#    $foo : 1 + 1,
-#    $bar : 2 + 2,
-#    $stuff : 3 + 3
-#}
+foo = {
+    $foo : 1 + 1,
+    "stuff" : 2 + 2,
+    $bar : 3 + 3
+}
+
+print( foo[$bar] )
+print( foo["stuff"] )
+print( foo.stuff )
 
 # Vector
 foo = []
@@ -72,14 +72,14 @@ if (1 == 1)
 # Delayed Evaluation
 #------------------------------------------------------------------------------
 
-#% delay [
-#    (Expression) : make_promise({ $1 })
-#]
-#
-#% force [
-#    (Expression) : $1
-#]
-#
-#foo = delay 1 + 1
-#foo = force foo
+% delay [
+    (Expression) : make_promise({ $1 })
+]
+
+% force [
+    (Expression) : $1()
+]
+
+foo = delay 1 + 1
+foo = force foo
 
index c1cf5a6860f4fd41ba1640e3407642677a82ccb3..0f2e163b9e22034d796a102d02a506554f9dac20 100644 (file)
@@ -30,6 +30,7 @@
 (define VECTOR vector)
 (define LIST list)
 (define PARAMS list)
+(define (MAP . args) (alist->hash-table args))
 (define (MACRO) '())
 
 ;------------------------------------------------------------------------------
index 4a0973679d3dd1ac4ab98d2654b5704a7bd12d98..2a1e80688b805263b9b3d6ba97512a0938af9088 100644 (file)
@@ -2,18 +2,20 @@
 #include "exception.h"
 #include "common.h"
 
+using namespace std;
+
 DLParser::DLParser() : BTParser()
 {
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Map", MAP_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Vector", VECT_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "List", LIST_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Block", BLK_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Id", ID_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Num", NUM_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Char", CHAR_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "String", STR_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Symbol", SYM_TYP ));
-    pattern_types.insert( std::pair<std::string,PatternType_T>( "Expression", EXPR_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Map", MAP_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Vector", VECT_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "List", LIST_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Block", BLK_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Id", ID_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Num", NUM_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Char", CHAR_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "String", STR_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Symbol", SYM_TYP ));
+    pattern_types.insert( pair<string,PatternType_T>( "Expression", EXPR_TYP ));
 }
 
 DLParser::~DLParser()
@@ -42,6 +44,7 @@ AST* DLParser::MacroExpansion()
     Macro macro = macros[ lookaheadToken(1).text() ];
     std::list<Pattern>::iterator patt_it;
 
+    match(ID);
     for(patt_it = macro.begin(); patt_it != macro.end(); patt_it++)
     {
         if( speculate_MacroPatternMatch(*patt_it) )
@@ -219,6 +222,17 @@ AST* DLParser::Expression(void)
 }
 
 AST* DLParser::AssignExpr(void)
+{
+    AST* ret = LogicalExpr();
+    if(lookaheadType(1) == ASSIGN)
+    {
+        match(ASSIGN);
+        ret = new AST(ASSIGN, 2, ret, LogicalExpr());
+    }
+    return ret;
+}
+
+AST* DLParser::LogicalExpr(void)
 {
     AST* ret = NULL;
     if( isMacro( lookaheadToken(1) ) )
@@ -227,28 +241,17 @@ AST* DLParser::AssignExpr(void)
     }
     else
     {
-        ret = LogicalExpr();
-        if(lookaheadType(1) == ASSIGN)
+        ret = CompExpr();
+        while((lookaheadType(1) == AND) || (lookaheadType(1) == OR))
         {
-            match(ASSIGN);
-            ret = new AST(ASSIGN, 2, ret, LogicalExpr());
+            ret = _new AST( lookaheadType(1), 1, ret);
+            consume();
+            ret->addChild( CompExpr() );
         }
     }
     return ret;
 }
 
-AST* DLParser::LogicalExpr(void)
-{
-    AST* ret = CompExpr();
-    while((lookaheadType(1) == AND) || (lookaheadType(1) == OR))
-    {
-        ret = _new AST( lookaheadType(1), 1, ret);
-        consume();
-        ret->addChild( CompExpr() );
-    }
-    return ret;
-}
-
 AST* DLParser::CompExpr(void)
 {
     AST* ret = AddSubExpr();
index 7a8182957752d8b767d5136b5af6a3edc313e3ed..c4e555496bb7f2c7af810d730cd426bc65376e18 100644 (file)
@@ -1,6 +1,8 @@
 #include "pattern.h"
 #include "dllexer.h"
 
+using namespace std;
+
 Pattern::Pattern(const std::list<PatternType_T>& patt, const AST* ast) : pattern(patt), expr_ast(ast)
 {
 }
index de129ca7aefa91e7e644f03a2a3554a779e97f96..cf469b6c7c4010393b17b26b4f1aa6d69a041cb9 100644 (file)
@@ -21,8 +21,9 @@ int main(int argc, char** argv)
         string input_fname(argv[1]);
         string temp_fname = createTempFileName( input_fname );
         ifstream input(input_fname.c_str());
+        ofstream output(temp_fname.c_str());
         DLParser parser;
-        Scheme printer;
+        Scheme printer(output);
         parser.input(new DLLexer(input));
         parser.parse();
         parser.process( printer );
index 785558db0921f59352f1ba9e921e4ead1a3fe09d..7a413681da0babe1e33ea5dc9d0750358c2d5ba6 100644 (file)
@@ -3,7 +3,7 @@
 
 using namespace std;
 
-Scheme::Scheme() : IVisitor() {
+Scheme::Scheme(std::ostream& out) : IVisitor(), stream(out) {
     ifstream input("res/environment.scm");
     if (input.is_open())
     {
@@ -11,7 +11,7 @@ Scheme::Scheme() : IVisitor() {
         {
             string line;
             getline(input,line);
-            cout << line << endl;
+            stream << line << endl;
         }
     }
     input.close();
@@ -27,6 +27,8 @@ string Scheme::typeToString(ASTNodeType type)
             ret << "ID "; break;
         case NUM:
             ret << "NUM "; break;
+        case MAP:
+            ret << "MAP "; break;
         case CHAR:
             ret << "CHAR "; break;
         case ADD:
@@ -73,6 +75,10 @@ string Scheme::typeToString(ASTNodeType type)
             ret << "FN_CALL "; break;
         case ARRY_IDX:
             ret << "ARRY_IDX "; break;
+        case SEP:
+            ret << "cons "; break;
+        case MEMB:
+            ret << "hash-table-ref "; break;
         case PARAMS:
             break;
         default:
@@ -88,18 +94,26 @@ void Scheme::beforeVisit(AST* cur, int depth)
 
 void Scheme::afterVisit(AST* cur, int depth)
 {
-    cout << endl;
+    stream << endl;
 }
 
 void Scheme::beforeChildren(AST* cur, int depth)
 {
+    if (cur->type() == MEMB)
+    {
+        AST* temp = cur->children()->back();
+        cur->children()->pop_back();
+        cur->children()->push_back( new AST(STRING, temp->text()) );
+        delete temp;
+    }
+
     if( isDatatype( cur->type() ) )
     {
         printDatatype( cur );
     }
     else
     {
-        cout << "(" << typeToString( cur->type() ) << cur->text();
+        stream << "(" << typeToString( cur->type() ) << cur->text();
     }
 }
 
@@ -107,16 +121,16 @@ void Scheme::afterChildren(AST* cur, int depth)
 {
     if( !isDatatype( cur->type() ) )
     {
-        cout << ")";
+        stream << ")";
     }
 }
 
 void Scheme::beforeChild(AST* cur, int depth)
 {
-    cout << endl;
+    stream << endl;
     for(int i = 0; i< depth; i++)
     {
-        cout << "  ";
+        stream << "  ";
     }
 }
 
@@ -147,19 +161,19 @@ void Scheme::printDatatype(AST* cur)
     switch(cur->type())
     {
         case ID:
-            cout << "dl/" << cur->text();
+            stream << "dl/" << cur->text();
             break;
         case NUM:
-            cout << cur->text();
+            stream << cur->text();
             break;
         case CHAR:
             charToString( cur->text() );
             break;
         case STRING:
-            cout << '"' << cur->text() << '"';
+            stream << '"' << cur->text() << '"';
             break;
         case SYMBOL:
-            cout << '\'' << cur->text();
+            stream << '\'' << cur->text();
             break;
         default:
             break;
@@ -171,15 +185,15 @@ void Scheme::charToString(string ch)
     switch(ch.at(0))
     {
         case ' ':
-            cout << "#\\space";
+            stream << "#\\space";
             break;
         case '\n':
-            cout << "#\\newline";
+            stream << "#\\newline";
             break;
         case '\r':
-            cout << "#\\return";
+            stream << "#\\return";
             break;
         default:
-            cout << "#\\" << ch;
+            stream << "#\\" << ch;
     }
 }
index aaed935a9c53a539ca9f11ffd70e13846c02616c..a6883549459c8e308c6ef63b99a064eb828065c1 100644 (file)
@@ -7,12 +7,14 @@
 #include "dllexer.h"
 
 class Scheme : public IVisitor {
+    protected:
+        std::ostream& stream;
     public:
-        Scheme();
-        string typeToString(ASTNodeType type);
+        Scheme(std::ostream& in);
+        std::string typeToString(ASTNodeType type);
         bool isDatatype(ASTNodeType type);
         void printDatatype(AST* cur);
-        void charToString(string ch);
+        void charToString(std::string ch);
     private:
         void beforeVisit(AST* cur, int depth);
         void afterVisit(AST* cur, int depth);