⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataastparser.cpp

📁 基于ANTLR的简单编译器源码version0.1
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
					t.SetType(BOOL_T);			
				
#line 344 "DataASTParser.cpp"
		break;
	}
	default:
	{
		throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
	}
	}
	_retTree = _t;
	return t;
}

TypeAttr  DataASTParser::expression(RefASTNodeExt _t) {
#line 411 "syntax.g"
	TypeAttr t;
#line 359 "DataASTParser.cpp"
	RefASTNodeExt expression_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	RefASTNodeExt id = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
#line 411 "syntax.g"
	CSymbol* symb;
#line 364 "DataASTParser.cpp"
	
	if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
		_t = ASTNULL;
	switch ( _t->getType()) {
	case INT:
	case HEX:
	case DOUBLE:
	case BIT:
	case BITS:
	case CHAR:
	case STRING:
	case LITERAL_true:
	case LITERAL_false:
	{
		t=const_value(_t);
		_t = _retTree;
		break;
	}
	case IDENT:
	{
		id = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
		_t = _t->getNextSibling();
#line 415 "syntax.g"
		
			   symb=symtable.GetSymb(id->getText());
			   bool temp=symb==NULL;
			   string errors="undefined identifier:"+id->getText();
			   ERROR_IF(temp,id->getLine(),errors);
			   t=symb->GetAttr();
			
#line 396 "DataASTParser.cpp"
		break;
	}
	default:
	{
		throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
	}
	}
	_retTree = _t;
	return t;
}

TypeAttr  DataASTParser::const_value(RefASTNodeExt _t) {
#line 295 "syntax.g"
	TypeAttr t;
#line 411 "DataASTParser.cpp"
	RefASTNodeExt const_value_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	RefASTNodeExt b = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt bs = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt i = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt h = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt d = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt c = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt s = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	
	if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
		_t = ASTNULL;
	switch ( _t->getType()) {
	case BIT:
	{
		b = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BIT);
		_t = _t->getNextSibling();
#line 297 "syntax.g"
		
					t.SetType(BIT_T);
		t.SetValue(b->getText());
					t.BitToStr();//resolve bit to 0/1 string
				
#line 435 "DataASTParser.cpp"
		break;
	}
	case BITS:
	{
		bs = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BITS);
		_t = _t->getNextSibling();
#line 303 "syntax.g"
		
					t.SetType(BITS_T);
		t.SetValue(bs->getText());
					ERROR_IF(!t.BitsToStr(),bs->getLine(),"bits length>32!");
				
#line 449 "DataASTParser.cpp"
		break;
	}
	case INT:
	{
		i = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),INT);
		_t = _t->getNextSibling();
#line 309 "syntax.g"
					
					t.IsInt();
		t.SetValue(i->getText());
					t.CalcLen();
				
#line 463 "DataASTParser.cpp"
		break;
	}
	case HEX:
	{
		h = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),HEX);
		_t = _t->getNextSibling();
#line 315 "syntax.g"
					
					t.IsInt();
		t.SetValue(h->getText());
		t.HexToStr();			
				
#line 477 "DataASTParser.cpp"
		break;
	}
	case DOUBLE:
	{
		d = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DOUBLE);
		_t = _t->getNextSibling();
#line 321 "syntax.g"
					
					t.IsDouble();
		t.SetValue(d->getText());
		t.CalcLen();			
				
#line 491 "DataASTParser.cpp"
		break;
	}
	case CHAR:
	{
		c = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),CHAR);
		_t = _t->getNextSibling();
#line 327 "syntax.g"
		
					t.SetType(CHAR_T);			
		t.SetValue(c->getText());
					t.CharToStr();
				
#line 505 "DataASTParser.cpp"
		break;
	}
	case STRING:
	{
		s = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),STRING);
		_t = _t->getNextSibling();
#line 333 "syntax.g"
		
					t.SetType(STR_T);			
		t.SetValue(d->getText());
					t.StrToStr();
				
#line 519 "DataASTParser.cpp"
		break;
	}
	case LITERAL_true:
	{
		RefASTNodeExt tmp15_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_true);
		_t = _t->getNextSibling();
#line 339 "syntax.g"
		
					t.SetType(BOOL_T);			
		t.SetValue("0");			
				
#line 532 "DataASTParser.cpp"
		break;
	}
	case LITERAL_false:
	{
		RefASTNodeExt tmp16_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_false);
		_t = _t->getNextSibling();
#line 344 "syntax.g"
		
					t.SetType(BOOL_T);			
		t.SetValue("1");			
				
#line 545 "DataASTParser.cpp"
		break;
	}
	default:
	{
		throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
	}
	}
	_retTree = _t;
	return t;
}

void DataASTParser::block(RefASTNodeExt _t) {
	RefASTNodeExt block_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	
	RefASTNodeExt __t92 = _t;
	RefASTNodeExt tmp17_AST_in = _t;
	match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),BLOCK);
	_t = _t->getFirstChild();
	{ // ( ... )*
	for (;;) {
		if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
			_t = ASTNULL;
		if ((_tokenSet_0.member(_t->getType()))) {
			statement(_t);
			_t = _retTree;
		}
		else {
			goto _loop94;
		}
		
	}
	_loop94:;
	} // ( ... )*
	_t = __t92;
	_t = _t->getNextSibling();
	_retTree = _t;
}

void DataASTParser::assign_statement(RefASTNodeExt _t) {
	RefASTNodeExt assign_statement_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	RefASTNodeExt id = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
#line 423 "syntax.g"
	
	CSymbol* symb;
	TypeAttr t1,t2;
	
#line 592 "DataASTParser.cpp"
	
	RefASTNodeExt __t98 = _t;
	RefASTNodeExt tmp18_AST_in = _t;
	match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),ASSIGN);
	_t = _t->getFirstChild();
	id = _t;
	match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
	_t = _t->getNextSibling();
	t2=expression(_t);
	_t = _retTree;
	_t = __t98;
	_t = _t->getNextSibling();
#line 429 "syntax.g"
	
		   symb=symtable.GetSymb(id->getText());
		   if(symb==NULL)
		      ERROR_IF(true,id->getLine(),"undefined identifier!");	  
	else
	{	   
			   t1=symb->GetAttr();
			   if(t2.IsConvertable(t1))//t2 can convert to t1
			   {
					symtable.SetSymValue(id->getText(),t2.value);
			   }
			   else
					ERROR_IF(true, id->getLine(), "data type uncompatiable!");
		   }		
		
#line 621 "DataASTParser.cpp"
	_retTree = _t;
}

void DataASTParser::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& )
{
}
const char* DataASTParser::tokenNames[] = {
	"<0>",
	"EOF",
	"<2>",
	"NULL_TREE_LOOKAHEAD",
	"APOSTROPHE",
	"SEMI",
	"COLON",
	"ASSIGN",
	"DIGIT",
	"an integer value",
	"a hexadecimal integer value",
	"an floating point value",
	"WS",
	"an identifer",
	"BIT",
	"BITS",
	"SL_COMMENT",
	"ML_COMMENT",
	"a character literal",
	"a string literal",
	"ESC",
	"BLOCK",
	"PROGRAM",
	"DEFASSIGN",
	"COMMA",
	"\"true\"",
	"\"false\"",
	"\"bit\"",
	"\"bits\"",
	"\"uint8\"",
	"\"char\"",
	"\"string\"",
	"\"uint16\"",
	"\"int16\"",
	"\"int\"",
	"\"uint\"",
	"\"float\"",
	"\"double\"",
	"\"bool\"",
	"LCURLY",
	"RCURLY",
	0
};

const unsigned long DataASTParser::_tokenSet_0_data_[] = { 4171235456UL, 127UL, 0UL, 0UL };
// ASSIGN BLOCK DEFASSIGN "bit" "bits" "uint8" "char" "string" "uint16" 
// "int16" "int" "uint" "float" "double" "bool" 
const ANTLR_USE_NAMESPACE(antlr)BitSet DataASTParser::_tokenSet_0(_tokenSet_0_data_,4);


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -