我来了,画张图换个心情,接着上回说
3.USE use_expression_list ';'
接着看下一个use_expression_list,这个是表示使用哪个模块,应为一个包中可以定义多个模块,但并非包中所有模块都有用,所以,使用use关键字定义要使用某个模块
看bison定义,
use_expression_list:IDENTIFIER
{
StatementList *ls = (StatementList*)parm;
ls->AddUseModuleList($1);
}
|use_expression_list ',' IDENTIFIER
{
StatementList *ls = (StatementList*)parm;
ls->AddUseModuleList($3);
}
;
他的语法支持两种,一种是每行写一个模块名,一种是一行可以写多个模块名
use abc
use abc,abc,ddd
他的后台解析程序为
void StatementList::AddUseModuleList(string modulename)
{
if (FindUseModuleList(modulename))
{
return;
}
if (!IsAddedImportFileAllPackAgeList(modulename)){
MError::CreateInstance()->PrintError(modulename + " module not found");
return;
}
ModuleAndConstant pac = { modulename, MCommon::CreateInstance()->ELFHash(string(modulename)), 0, 0, 0, 0, 0 };
UseModuleList->push_back(pac);
}
首先使用FindUseModuleList从现有使用模块列表中查找是否已经加入列表,如果加入则返回,如果没有加入,则调用IsAddedImportFileAllPackAgeList,从当前文件中使用的所有包中查找是否有这个模块,如果没有找到则报错,如果找到个报名创建一个基本属性
struct ModuleAndConstant
{
string modulename;
hashValue hash;
vector<double> *doublelist;
vector<string> *stringlist;
vector<string> *functionlist;
vector<MentholDebug> *debuglist;
vector<GlobalVarAttr>* globalmemory;
};
加入到模块列表中,这个时候modulename,hash以外,全部先不管
4.wmain_definition
这个是程序的入口点。他的BISON定义如下
wmain_definition:WMAIN ':'function_parameter funciton_codeblock_statement
{
StatementList *ls = (StatementList*)parm;
FunctionDefinition* fd= new FunctionDefinition("_mmain",MNT_MainFunction);
fd->AddChilder($3);
fd->AddChilder($4);
ls->AddFunction("_mmain");
ls->AddMainModuleList(fd);
}
;
他使用到了 function_parameter,funciton_codeblock_statement 表达式,所有函数都必须要的两个表达式,
这两个表达式中,基本能用到所有的bison表达式了,所以wmain介绍停止,要从底层介绍起
5.dict_declare
这是字典类型,他的BISON定义如下
dict_expression:IDENTIFIER DICT_OP assignment_expression_definition
{
$$ = new DictExpression($1,$3);
}
;
dict_statement:dict_expression
{
$$ = new DictStatement();
$$->AddChilder($1);
}
| dict_statement ',' dict_expression
{
$1->AddChilder($3);
}
;
dict_declare:'(' dict_statement ')'{ $$ = $2;};
|'(' ')'{
$$ = new DictStatement();
}
;
要完成表达一个字典,需要两个部分DictStatement,DictExpression两个类,
DictStatement::DictStatement()
{
Member = new vector <Statement*>();
NType = MNT_DictDeclare;
wfileaddressline = lineno;
}
DictExpression::DictExpression(string _k,Statement* _v)
{
key = _k;
StatementList::GetInstance()->AddStringConstant(key);
StatementList::GetInstance()->AddDictKeyConstant(key);
value = _v;
_v->ParentNode =this;
NType = MNT_DictExpression;
wfileaddressline = lineno;
}
定义一个字典,例如a::1,这个时候调用DictExpression,但是字典中可能有多个属性,说以要递归dict_statement:dict_expression,这个,循环生成,最后调用DictStatement ,生成一个完整的字典
expression_definition
这个表达是,算是整个BISON里最核心的一部分了,他几乎是所有表达是的基础
它的BISON定义如下
expression_definition:assignment_expression_definition {
$$ =new ExpressionList();
$$->AddChilder($1);
}
|expression_definition ',' assignment_expression_definition
{
$1->AddChilder($3);
}
;
表面上看,这只是个简单的赋值表达是,但是,赋值表达式本身就几乎囊括了所有表达式。
有点长,下次写吧