From: Mike D. Lowis Date: Sat, 10 Mar 2012 20:28:56 +0000 (-0500) Subject: Fixed macro expansion, Cleaned up namespaces, and fixed scheme output for maps X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=2b622b2b6d686b8a74678401619a4acf033806fb;p=archive%2Fdlang.git Fixed macro expansion, Cleaned up namespaces, and fixed scheme output for maps --- diff --git a/example.dl b/example.dl index cb5ef57..fd9736b 100644 --- a/example.dl +++ b/example.dl @@ -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 diff --git a/res/environment.scm b/res/environment.scm index c1cf5a6..0f2e163 100644 --- a/res/environment.scm +++ b/res/environment.scm @@ -30,6 +30,7 @@ (define VECTOR vector) (define LIST list) (define PARAMS list) +(define (MAP . args) (alist->hash-table args)) (define (MACRO) '()) ;------------------------------------------------------------------------------ diff --git a/source/dlparser/dlparser.cpp b/source/dlparser/dlparser.cpp index 4a09736..2a1e806 100644 --- a/source/dlparser/dlparser.cpp +++ b/source/dlparser/dlparser.cpp @@ -2,18 +2,20 @@ #include "exception.h" #include "common.h" +using namespace std; + DLParser::DLParser() : BTParser() { - pattern_types.insert( std::pair( "Map", MAP_TYP )); - pattern_types.insert( std::pair( "Vector", VECT_TYP )); - pattern_types.insert( std::pair( "List", LIST_TYP )); - pattern_types.insert( std::pair( "Block", BLK_TYP )); - pattern_types.insert( std::pair( "Id", ID_TYP )); - pattern_types.insert( std::pair( "Num", NUM_TYP )); - pattern_types.insert( std::pair( "Char", CHAR_TYP )); - pattern_types.insert( std::pair( "String", STR_TYP )); - pattern_types.insert( std::pair( "Symbol", SYM_TYP )); - pattern_types.insert( std::pair( "Expression", EXPR_TYP )); + pattern_types.insert( pair( "Map", MAP_TYP )); + pattern_types.insert( pair( "Vector", VECT_TYP )); + pattern_types.insert( pair( "List", LIST_TYP )); + pattern_types.insert( pair( "Block", BLK_TYP )); + pattern_types.insert( pair( "Id", ID_TYP )); + pattern_types.insert( pair( "Num", NUM_TYP )); + pattern_types.insert( pair( "Char", CHAR_TYP )); + pattern_types.insert( pair( "String", STR_TYP )); + pattern_types.insert( pair( "Symbol", SYM_TYP )); + pattern_types.insert( pair( "Expression", EXPR_TYP )); } DLParser::~DLParser() @@ -42,6 +44,7 @@ AST* DLParser::MacroExpansion() Macro macro = macros[ lookaheadToken(1).text() ]; std::list::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(); diff --git a/source/dlparser/macro/pattern.cpp b/source/dlparser/macro/pattern.cpp index 7a81829..c4e5554 100644 --- a/source/dlparser/macro/pattern.cpp +++ b/source/dlparser/macro/pattern.cpp @@ -1,6 +1,8 @@ #include "pattern.h" #include "dllexer.h" +using namespace std; + Pattern::Pattern(const std::list& patt, const AST* ast) : pattern(patt), expr_ast(ast) { } diff --git a/source/main.cpp b/source/main.cpp index de129ca..cf469b6 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -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 ); diff --git a/source/visitors/scheme/scheme.cpp b/source/visitors/scheme/scheme.cpp index 785558d..7a41368 100644 --- a/source/visitors/scheme/scheme.cpp +++ b/source/visitors/scheme/scheme.cpp @@ -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; } } diff --git a/source/visitors/scheme/scheme.h b/source/visitors/scheme/scheme.h index aaed935..a688354 100644 --- a/source/visitors/scheme/scheme.h +++ b/source/visitors/scheme/scheme.h @@ -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);