#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()
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) )
}
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) ) )
}
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();
using namespace std;
-Scheme::Scheme() : IVisitor() {
+Scheme::Scheme(std::ostream& out) : IVisitor(), stream(out) {
ifstream input("res/environment.scm");
if (input.is_open())
{
{
string line;
getline(input,line);
- cout << line << endl;
+ stream << line << endl;
}
}
input.close();
ret << "ID "; break;
case NUM:
ret << "NUM "; break;
+ case MAP:
+ ret << "MAP "; break;
case CHAR:
ret << "CHAR "; break;
case ADD:
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:
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();
}
}
{
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 << " ";
}
}
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;
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;
}
}