写不动了,歇会
This commit is contained in:
parent
018ea85aa0
commit
2c9b31cb24
|
@ -23,8 +23,6 @@ TypeIR* intPtr; //ָ
|
|||
TypeIR* charPtr; //指向字符类型的内部表示
|
||||
TypeIR* boolPtr; //指向布尔类型的内部表示
|
||||
|
||||
|
||||
|
||||
void SemanticAnalysis::initial()
|
||||
{
|
||||
for (int i = 0; i < 1000; i++)
|
||||
|
@ -687,10 +685,10 @@ TypeIR* SemanticAnalysis::Expr(TreeNode* t, AccessKind* Ekind)
|
|||
//数组变量或域变量
|
||||
else
|
||||
{
|
||||
//数组变量
|
||||
//数组变量 Var = Var0[E]
|
||||
if (t->attr.ExpAttr.varkind == ArrayMembV)
|
||||
Eptr = arrayVar(t);
|
||||
//域变量
|
||||
//域变量 Var = Var0.id
|
||||
else if (t->attr.ExpAttr.varkind == FieldMembV)
|
||||
Eptr = recordVar(t);
|
||||
else
|
||||
|
@ -740,5 +738,184 @@ TypeIR* SemanticAnalysis::Expr(TreeNode* t, AccessKind* Ekind)
|
|||
return Eptr;
|
||||
}
|
||||
|
||||
//数组变量的处理分析函数
|
||||
TypeIR* SemanticAnalysis::arrayVar(TreeNode* t)
|
||||
{
|
||||
TypeIR* Eptr = nullptr;
|
||||
SymbTable* entry = nullptr;
|
||||
if (FindEntry(t->name[0], &entry))
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "未找到此标识符");
|
||||
entry = nullptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindAttr(entry).kind != varKind)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是变量");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindAttr(entry).idtype != NULL)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是数组变量");
|
||||
}
|
||||
else
|
||||
{
|
||||
//数组下标类型
|
||||
TypeIR* temp1 = NULL;
|
||||
TypeIR* temp2 = NULL;
|
||||
temp1 = entry->attrIR.idtype->More.ArrayAttr.indexTy;
|
||||
temp2 = Expr(t->child[0], NULL);
|
||||
if (temp1 == NULL || temp2 == NULL)
|
||||
return NULL;
|
||||
|
||||
if (Compat(temp1, temp2))
|
||||
Eptr = entry->attrIR.idtype->More.ArrayAttr.elemTy;
|
||||
else
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "与下标类型不相符");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Eptr;
|
||||
}
|
||||
|
||||
//记录变量中域变量的分析处理函数
|
||||
TypeIR* SemanticAnalysis::recordVar(TreeNode* t)
|
||||
{
|
||||
TypeIR* Eptr = nullptr;
|
||||
SymbTable* entry = nullptr;
|
||||
if (FindEntry(t->name[0], &entry) == false)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "未找到此标识符");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindAttr(entry).kind != varKind)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是变量");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindAttr(entry).idtype->kind != recordTy)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是变量");
|
||||
}
|
||||
//检查合法域名,看id名是否在域里
|
||||
else
|
||||
{
|
||||
fieldChain* tempF = NULL;
|
||||
tempF = entry->attrIR.idtype->More.body;
|
||||
while (tempF != NULL)
|
||||
{
|
||||
//不相等测下一个
|
||||
if (t->child[0]->name[0] != tempF->id)
|
||||
tempF = tempF->Next;
|
||||
else
|
||||
Eptr = tempF->UnitType;
|
||||
}
|
||||
|
||||
|
||||
if (tempF == NULL)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是合法域名");
|
||||
}
|
||||
else
|
||||
{
|
||||
//?数组变量
|
||||
if (t->child[0]->child != nullptr)
|
||||
Eptr = arrayVar(t->child[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Eptr;
|
||||
}
|
||||
|
||||
//赋值语句分析
|
||||
void SemanticAnalysis::assignstatement(TreeNode* t)
|
||||
{
|
||||
TypeIR* Eptr = nullptr;
|
||||
SymbTable* entry = nullptr;
|
||||
TreeNode* child1 = t->child[0];
|
||||
TreeNode* child2 = t->child[1];
|
||||
|
||||
if (child1->child[0] == NULL)
|
||||
{
|
||||
if (FindEntry(t->name[0], &entry) == false)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "未找到此标识符");
|
||||
entry = nullptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindAttr(entry).kind != varKind)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是变量");
|
||||
}
|
||||
else
|
||||
{
|
||||
Eptr = entry->attrIR.idtype;
|
||||
child1->table[0] = entry;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (child1->attr.ExpAttr.varkind == ArrayMembV)
|
||||
Eptr = arrayVar(child1);
|
||||
//? child1->attr.ExpAttr.varkind==FieldMembV 是否判断
|
||||
else
|
||||
Eptr = recordVar(child1);
|
||||
}
|
||||
|
||||
//检查赋值号两侧是否等价
|
||||
if (Eptr != NULL)
|
||||
if (!Compat(Expr(child2, NULL), Eptr))
|
||||
semanticError(t->lineno, "等号两侧不等价");
|
||||
}
|
||||
|
||||
//过程语句分析
|
||||
void SemanticAnalysis::callstatement(TreeNode* t)
|
||||
{
|
||||
SymbTable* entry = NULL;
|
||||
bool temp = FindEntry(t->child[0]->name[0], &entry);
|
||||
t->child[0]->table[0] = entry;
|
||||
|
||||
if (temp == false)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "未找到此函数");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FindAttr(entry).kind != procKind)
|
||||
{
|
||||
string temp = t->name[0].c_str();
|
||||
semanticError(t->lineno, temp + "不是函数名");
|
||||
}
|
||||
else
|
||||
{
|
||||
/*===============================*/
|
||||
//形式参匹配
|
||||
/*===============================*/
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -69,9 +69,9 @@ typedef enum { intTy, charTy, arrayTy, recordTy, boolTy }TypeKind;
|
|||
//域类型单元结构定义
|
||||
typedef struct fieldchain
|
||||
{
|
||||
char id[10]; /*变量名*/
|
||||
int off; /*所在记录中的偏移*/
|
||||
struct typeIR* UnitType; /*域中成员的类型*/
|
||||
string id; //变量名
|
||||
int off; //所在记录中的偏移
|
||||
struct typeIR* UnitType; //域中成员的类型
|
||||
struct fieldchain* Next;
|
||||
}fieldChain;
|
||||
|
||||
|
@ -97,12 +97,14 @@ typedef struct typeIR
|
|||
class SemanticAnalysis
|
||||
{
|
||||
public:
|
||||
//其他函数
|
||||
void initial(); //全局变量初始化
|
||||
void fileClose(); //文件关闭
|
||||
void semanticError(int line, string errorMessage);
|
||||
SymbTable* NewTable(void); //新建空符号表
|
||||
TypeIR* NewTy(TypeKind kind);//新建类型内部表示
|
||||
|
||||
|
||||
//符号表实现
|
||||
void CreatTable(void); //创建符号表
|
||||
void DestroyTable(); //撤销符号表
|
||||
|
@ -112,6 +114,7 @@ public:
|
|||
bool FindField(string Id, fieldChain* head, fieldChain** Entry);
|
||||
void PrintSymbTable(); //打印符号表
|
||||
|
||||
|
||||
//检查语义信息
|
||||
void analyze(TreeNode* currentP); //语义分析主函数
|
||||
TypeIR* TypeProcess(TreeNode* t, DecKind deckind);
|
||||
|
@ -128,4 +131,9 @@ public:
|
|||
void statement(TreeNode* t); //语句序列分析处理函数
|
||||
TypeIR* Expr(TreeNode* t, AccessKind* Ekind);
|
||||
//表达式分析处理函数
|
||||
TypeIR* arrayVar(TreeNode* t); //数组变量的处理分析函数
|
||||
TypeIR* recordVar(TreeNode* t); //记录变量中域变量的分析处理函数
|
||||
void assignstatement(TreeNode* t); //赋值语句分析函数
|
||||
void callstatement(TreeNode* t); //过程调用语句分析处理函数
|
||||
|
||||
};
|
Loading…
Reference in New Issue