自己去创建一个编程语言吧(7)

我来了,画张图换个心情,接着上回说
在这里插入图片描述

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);
	 }
;  

表面上看,这只是个简单的赋值表达是,但是,赋值表达式本身就几乎囊括了所有表达式。

有点长,下次写吧

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值