Пример #1
0
Object* SymbolTable::add(int l, int c, wchar_t* name, int kind, int type){
	Object* obj = new Object();
	Object* p = topScope->locals;
	Object* last = NULL;
	
//	wprintf(L"%ls\n", name);
	obj->name = name;
	obj->kind = kind;
	obj->type = type;
	obj->level = currentLevel;
	while(p != NULL){
		if(coco_string_equal(p->name, name)){
			wchar_t str[272];
			coco_swprintf(str, 272, L"%ls declared twice", name);
			putError(l, c, str);
		}
		last = p;
		p = p->next;
	}
	if(last == NULL)
		topScope->locals = obj;
	else
		last->next = obj;
	if(kind = var)
		obj->addr = topScope->nextAddr++;
	return obj;
}
Пример #2
0
void Parser::ProcDecl() {
    wchar_t* name;
    Obj *obj;
    int adr;
    Expect(9);
    Ident(name);
    obj = tab->NewObj(name, proc, undef);
    obj->adr = gen->pc;
    if (coco_string_equal(name, L"Main")) gen->progStart = gen->pc;
    tab->OpenScope();
    Expect(10);
    Expect(11);
    Expect(12);
    gen->Emit(ENTER, 0);
    adr = gen->pc - 2;
    while (StartOf(1)) {
        if (la->kind == 28 || la->kind == 29) {
            VarDecl();
        } else {
            Stat();
        }
    }
    Expect(13);
    gen->Emit(LEAVE);
    gen->Emit(RET);
    gen->Patch(adr, tab->topScope->nextAdr);
    tab->CloseScope();
}
Пример #3
0
HashTable::Obj* HashTable::Get0(char *key) const {
	int k = coco_string_hash(key) % size;
	HashTable::Obj *o = data[k];
	while (o != NULL && !coco_string_equal(key, o->key)) {
		o = o->next;
	}
	return o;
}
Symbol* const SymbolTable::FindSymbol(wchar_t* const pName) 
{
	if (pName == 0 || coco_string_equal(pName, L"")) { 
		return 0;	// invalid symbol name
	}

	// search symbol with name pName in symbol table
	tSymbolList::const_iterator ret = mSymbolList.find(pName);
	if (ret == mSymbolList.end()) {
		return 0;	// undefined symbol
	}
	return ret->second;
}
Пример #5
0
Object* SymbolTable::find(int l, int c, wchar_t* name){
	Object* obj;
	Object* scope = topScope;
	while(scope != NULL){
		obj = scope->locals;
		while(obj != NULL){
			if(coco_string_equal(obj->name, name))
				return obj;
			obj = obj->next;
		}
		scope = scope->next;
	}
	wchar_t str[272];
	coco_swprintf(str, 272, L"%ls is undeclared", name);
	putError(l, c, str);
	return undefObj;
}
Symbol* const SymbolTable::AddSymbol(Symbol* pSymbol)
{
	if (pSymbol == 0) {
		return 0;	// invalid symbol
	}
	wchar_t* pName = pSymbol->GetName();
	if (pName == 0 || coco_string_equal(pName, L"")) {
		delete pSymbol; pSymbol = 0;
		return 0;	// invalid symbol name
	}

	// insert symbol pSymbol to symbol table (if not already added)
	std::pair<tSymbolList::iterator, bool> ret = mSymbolList.insert(tSymbolEntry(pName, pSymbol));
	if (ret.second == false)
	{
		// symbol already added to symbol table
		if (ret.first->second != pSymbol) {
			delete pSymbol;
			pSymbol = ret.first->second;
		}
	}		
	return pSymbol;
}
Пример #7
0
int wmain(int argc, wchar_t *argv[]) {
#elif defined __GNUC__
int main(int argc, char *argv_[]) {
    wchar_t ** argv = new wchar_t*[argc];
    for (int i = 0; i < argc; ++i) {
        argv[i] = coco_string_create(argv_[i]);
    }
#else
#error unknown compiler!
#endif

    wprintf(L"CocoXml/R (Oct 11, 2008)\n");

    wchar_t *srcName = NULL, *nsName = NULL, *frameDir = NULL, *ddtString = NULL, *traceFileName = NULL;
    wchar_t *outDir = NULL;
    char *chTrFileName = NULL;

    for (int i = 1; i < argc; i++) {
        if (coco_string_equal(argv[i], L"-namespace") && i < argc - 1) nsName = coco_string_create(argv[++i]);
        else if (coco_string_equal(argv[i], L"-frames") && i < argc - 1) frameDir = coco_string_create(argv[++i]);
        else if (coco_string_equal(argv[i], L"-trace") && i < argc - 1) ddtString = coco_string_create(argv[++i]);
        else if (coco_string_equal(argv[i], L"-o") && i < argc - 1) outDir = coco_string_create_append(argv[++i], L"/");
        else srcName = coco_string_create(argv[i]);
    }

#if defined __GNUC__
    for (int i = 0; i < argc; ++i) {
        coco_string_delete(argv[i]);
    }
    delete [] argv; argv = NULL;
#endif

    if (argc > 0 && srcName != NULL) {
        int pos = coco_string_lastindexof(srcName, '/');
        if (pos < 0) pos = coco_string_lastindexof(srcName, '\\');
        wchar_t* file = coco_string_create(srcName);
        wchar_t* srcDir = coco_string_create(srcName, 0, pos+1);

        CocoXml::Scanner *scanner = new CocoXml::Scanner(file);
        CocoXml::Parser  *parser  = new CocoXml::Parser(scanner);

        traceFileName = coco_string_create_append(srcDir, L"trace.txt");
        chTrFileName = coco_string_create_char(traceFileName);

        if ((parser->trace = fopen(chTrFileName, "w")) == NULL) {
            wprintf(L"-- could not open %ls\n", chTrFileName);
            exit(1);
        }

        parser->tab  = new CocoXml::Tab(parser);
        parser->xsdata  = new CocoXml::XmlScannerData(parser);
        parser->pgen = new CocoXml::ParserGen(parser);

        parser->tab->srcName  = coco_string_create(srcName);
        parser->tab->srcDir   = coco_string_create(srcDir);
        parser->tab->nsName   = coco_string_create(nsName);
        parser->tab->frameDir = coco_string_create(frameDir);
        parser->tab->outDir   = coco_string_create(outDir != NULL ? outDir : srcDir);

        if (ddtString != NULL) parser->tab->SetDDT(ddtString);

        parser->Parse();

        fclose(parser->trace);

        // obtain the FileSize
        parser->trace = fopen(chTrFileName, "r");
        fseek(parser->trace, 0, SEEK_END);
        long fileSize = ftell(parser->trace);
        fclose(parser->trace);
        if (fileSize == 0)
            remove(chTrFileName);
        else
            wprintf(L"trace output is in %ls\n", chTrFileName);

        wprintf(L"%d errors detected\n", parser->errors->count);
        if (parser->errors->count != 0) {
            exit(1);
        }

        delete parser->pgen;
        delete parser->xsdata;
        delete parser->tab;
        delete parser;
        delete scanner;
        coco_string_delete(file);
        coco_string_delete(srcDir);
    } else {
        wprintf(L"Usage: CocoXml Grammar.ATG {Option}\n");
        wprintf(L"Options:\n");
        wprintf(L"  -namespace <namespaceName>\n");
        wprintf(L"  -frames    <frameFilesDirectory>\n");
        wprintf(L"  -trace     <traceString>\n");
        wprintf(L"  -o         <outputDirectory>\n");
        wprintf(L"Valid characters in the trace string:\n");
        wprintf(L"  A  trace automaton\n");
        wprintf(L"  F  list first/follow sets\n");
        wprintf(L"  G  print syntax graph\n");
        wprintf(L"  I  trace computation of first sets\n");
        wprintf(L"  J  list ANY and SYNC sets\n");
        wprintf(L"  P  print statistics\n");
        wprintf(L"  S  list symbol table\n");
        wprintf(L"  X  list cross reference table\n");
        wprintf(L"XmlScanner.frame and XmlParser.frame files needed in ATG directory\n");
        wprintf(L"or in a directory specified in the -frames option.\n");
    }

    coco_string_delete(srcName);
    coco_string_delete(nsName);
    coco_string_delete(frameDir);
    coco_string_delete(ddtString);
    coco_string_delete(chTrFileName);
    coco_string_delete(traceFileName);

    return 0;
}