#ifndef _DECLARATION_H
#define _DECLARATION_H
#include "Vector.h"
#include <stdio.h>
#include "Stmt.h"
#include "Port.h"

typedef struct Declaration_t CDeclaration;


typedef struct Declaration_VMT...{
void (*generate)(CDeclaration*, FILE*);
}CDeclaration_VMT;


struct Declaration_t...{
const CDeclaration_VMT *vmt;
int srcLineNoBegin;
int srcLineNoEnd;
};

extern void CDeclaration_Initialize(CDeclaration*, int, int);

extern void CDeclaration_Generate(CDeclaration*, FILE*);

#define Declaration_Generate(this,arg1)
(((CDeclaration*)(this))->vmt->generate((CDeclaration*)(this),arg1))

#endif
#include "Declaration.h"


static const CDeclaration_VMT vmt = ...{ CDeclaration_Generate };

void CDeclaration_Initialize(CDeclaration *this, int no1, int no2)

...{
((CDeclaration*)this)->vmt = (const CDeclaration_VMT*)&vmt;

this->srcLineNoBegin = no1;
this->srcLineNoEnd = no2;
}

void CDeclaration_Generate(CDeclaration *this, FILE *output)

...{
#ifdef DEBUG
fprintf(output, "CDeclaration_Generate ");
#endif
}
#ifndef _VARIABLE_DECL_H
#define _VARIABLE_DECL_H
#include "Expression.h"
#include "Declaration.h"

typedef struct VariableDecl_t CVariableDecl;


typedef struct VariableDecl_VMT...{
void (*generate)(CVariableDecl*, FILE*);
}CVariableDecl_VMT;


struct VariableDecl_t...{
CDeclaration super;
char *name;
CExpression *constraint;
char *type;
};

extern void CVariableDecl_Initialize(CVariableDecl*, char*, CExpression*, char*, int, int);

extern void CVariableDecl_Generate(CVariableDecl*, FILE*);

#endif
#include <string.h>
#include "VariableDecl.h"


static const CVariableDecl_VMT vmt = ...{ CVariableDecl_Generate };

void CVariableDecl_Initialize(CVariableDecl *this, char *name, CExpression *constraint, char *type, int no1, int no2)

...{
CDeclaration_Initialize((CDeclaration*)this, no1, no2);
((CDeclaration*)this)->vmt = (const CDeclaration_VMT*)&vmt;

this->name = name;
this->constraint = constraint;
this->type = type;
}

void CVariableDecl_Generate(CVariableDecl *this, FILE *output)

...{

fprintf(output, "Dim %s", this->name);


if(this->constraint != 0)...{
Expression_Generate(this->constraint, output);
}

if(!strncmp(this->type, "string", 6))...{
fprintf(output, " As String ");

}else if(!strncmp(this->type, "integer", 7))...{
fprintf(output, " As Long ");

}else...{
fprintf(output, " As %s ", this->type);
}
}

#ifndef _FUNCTION_DECL_H
#define _FUNCTION_DECL_H
#include "Declaration.h"

typedef struct FunctionDecl_t CFunctionDecl;


typedef struct FunctionDecl_VMT...{
void (*generate)(CFunctionDecl*, FILE*);
}CFunctionDecl_VMT;


struct FunctionDecl_t...{
CDeclaration super;
Vector *decls;
char *name;
Vector *args;
char *retType;
Vector *stmts;
};

extern void CFunctionDecl_Initialize(CFunctionDecl*, char*, Vector*, Vector*, char*, Vector*, int, int);

extern void CFunctionDecl_Generate(CFunctionDecl*, FILE*);

#endif
#include "FunctionDecl.h"


static const CFunctionDecl_VMT vmt = ...{ CFunctionDecl_Generate };


void CFunctionDecl_Initialize(CFunctionDecl *this, char *name, Vector *decls, Vector* args, char *retType, Vector *stmts, int no1, int no2)...{
CDeclaration_Initialize((CDeclaration*)this, no1, no2);
((CDeclaration*)this)->vmt = (const CDeclaration_VMT*)&vmt;

this->decls = decls;
this->name = name;
this->args = args;
this->retType = retType;
this->stmts = stmts;
}


void CFunctionDecl_Generate(CFunctionDecl *this, FILE *output)...{
int i, j;
CDeclaration *decl = (CDeclaration*)this;
fprintf(output, "Function %s(", this->name);


if(this->args != 0)...{

for(i = 0; i < size(this->args); i++)...{
CPort *port = elementAt(this->args, i);
Port_Generate(port, output);

if(i < size(this->args) - 1)...{
fprintf(output, ",");
}
}
}

fprintf(output, ") As %s ", this->retType);

fprintf(output, "Dim s_(%d) as String ", decl->srcLineNoEnd - decl->srcLineNoBegin + 1);

for(i = decl->srcLineNoBegin - 1, j = 0; i < decl->srcLineNoEnd; i++, j++)...{
fprintf(output, "s_(%3d) = "%3d:%s" ", j, i + 1, getLineAt(i));
}
fprintf(output, "LoadSrc2 s_ ", this->name);


if(this->decls != 0)...{

for(i = 0; i < size(this->decls); i++)...{
Declaration_Generate(elementAt(this->decls, i), output);
}
}

fprintf(output, "Dim loop_count As Integer ");


if(this->stmts != 0)...{

for(i = 0; i < size(this->stmts); i++)...{
Stmt_Generate(elementAt(this->stmts, i), output);
}
}

fprintf(output, "End Function ");
}
发表于 @ 2007年09月29日 11:24:00|评论(loading...)|编辑