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

📄 dataastparser.cpp

📁 基于ANTLR的简单编译器源码version0.1
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* $ANTLR 2.7.7 (2006-11-01): "syntax.g" -> "DataASTParser.cpp"$ */
#include "DataASTParser.hpp"
#include <antlr/Token.hpp>
#include <antlr/AST.hpp>
#include <antlr/NoViableAltException.hpp>
#include <antlr/MismatchedTokenException.hpp>
#include <antlr/SemanticException.hpp>
#include <antlr/BitSet.hpp>
#line 1 "syntax.g"
#line 11 "DataASTParser.cpp"
DataASTParser::DataASTParser()
	: ANTLR_USE_NAMESPACE(antlr)TreeParser() {
}

void DataASTParser::program(RefASTNodeExt _t) {
	RefASTNodeExt program_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	
	RefASTNodeExt __t80 = _t;
	RefASTNodeExt tmp1_AST_in = _t;
	match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),PROGRAM);
	_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 _loop82;
		}
		
	}
	_loop82:;
	} // ( ... )*
	_t = __t80;
	_t = _t->getNextSibling();
#line 255 "syntax.g"
	
	symtable.SaveData("test.data");
	
#line 44 "DataASTParser.cpp"
	_retTree = _t;
}

void DataASTParser::statement(RefASTNodeExt _t) {
	RefASTNodeExt statement_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	
	if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
		_t = ASTNULL;
	switch ( _t->getType()) {
	case DEFASSIGN:
	case LITERAL_bit:
	case LITERAL_bits:
	case 29:
	case LITERAL_char:
	case LITERAL_string:
	case 32:
	case 33:
	case LITERAL_int:
	case LITERAL_uint:
	case LITERAL_float:
	case LITERAL_double:
	case LITERAL_bool:
	{
		definition(_t);
		_t = _retTree;
		break;
	}
	case ASSIGN:
	{
		assign_statement(_t);
		_t = _retTree;
		break;
	}
	case BLOCK:
	{
		block(_t);
		_t = _retTree;
		break;
	}
	default:
	{
		throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
	}
	}
	_retTree = _t;
}

void DataASTParser::definition(RefASTNodeExt _t) {
	RefASTNodeExt definition_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	
	var_def(_t);
	_t = _retTree;
	_retTree = _t;
}

void DataASTParser::var_def(RefASTNodeExt _t) {
	RefASTNodeExt var_def_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	RefASTNodeExt id = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
	RefASTNodeExt ids = RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST);
#line 264 "syntax.g"
	
	TypeAttr t1,t2;  
	
#line 108 "DataASTParser.cpp"
	
	if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
		_t = ASTNULL;
	switch ( _t->getType()) {
	case DEFASSIGN:
	{
		RefASTNodeExt __t85 = _t;
		RefASTNodeExt tmp2_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),DEFASSIGN);
		_t = _t->getFirstChild();
		t1=type_name(_t);
		_t = _retTree;
		id = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
		_t = _t->getNextSibling();
		t2=expression(_t);
		_t = _retTree;
#line 272 "syntax.g"
		
				    if(t2.IsConvertable(t1))//t2 can convert to t1
					{
					   if(symtable.GetSymb(id->getText())==NULL)
					     symtable.AddSymb(t1,id->getText(),t2.value);			     
					   else
					     ERROR_IF(true, id->getLine(), "Identifier redefined!");
					}
					else
					   ERROR_IF(true, id->getLine(), "Data assign type error!");
				
#line 138 "DataASTParser.cpp"
		_t = __t85;
		_t = _t->getNextSibling();
		break;
	}
	case LITERAL_bit:
	case LITERAL_bits:
	case 29:
	case LITERAL_char:
	case LITERAL_string:
	case 32:
	case 33:
	case LITERAL_int:
	case LITERAL_uint:
	case LITERAL_float:
	case LITERAL_double:
	case LITERAL_bool:
	{
		{
		t1=type_name(_t);
		_t = _retTree;
		{ // ( ... )*
		for (;;) {
			if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
				_t = ASTNULL;
			if ((_t->getType() == IDENT)) {
				ids = _t;
				match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),IDENT);
				_t = _t->getNextSibling();
#line 286 "syntax.g"
				
							if(symtable.GetSymb(id->getText())!=NULL)
							   ERROR_IF(false, id->getLine(), "Identifier redefined!");
							else	    
						       symtable.AddSymb(t1,ids->getText(),"");
						
#line 174 "DataASTParser.cpp"
			}
			else {
				goto _loop88;
			}
			
		}
		_loop88:;
		} // ( ... )*
		}
		break;
	}
	default:
	{
		throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(ANTLR_USE_NAMESPACE(antlr)RefAST(_t));
	}
	}
	_retTree = _t;
}

TypeAttr  DataASTParser::type_name(RefASTNodeExt _t) {
#line 350 "syntax.g"
	TypeAttr t;
#line 197 "DataASTParser.cpp"
	RefASTNodeExt type_name_AST_in = (_t == RefASTNodeExt(ASTNULL)) ? RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) : _t;
	
	if (_t == RefASTNodeExt(ANTLR_USE_NAMESPACE(antlr)nullAST) )
		_t = ASTNULL;
	switch ( _t->getType()) {
	case LITERAL_bit:
	{
		RefASTNodeExt tmp3_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_bit);
		_t = _t->getNextSibling();
#line 352 "syntax.g"
		
					t.SetType(BIT_T);			
				
#line 212 "DataASTParser.cpp"
		break;
	}
	case LITERAL_bits:
	{
		RefASTNodeExt tmp4_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_bits);
		_t = _t->getNextSibling();
#line 356 "syntax.g"
		
					t.SetType(BITS_T);			
				
#line 224 "DataASTParser.cpp"
		break;
	}
	case 29:
	{
		RefASTNodeExt tmp5_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),29);
		_t = _t->getNextSibling();
#line 360 "syntax.g"
		
					t.SetType(UCHAR_T);			
				
#line 236 "DataASTParser.cpp"
		break;
	}
	case LITERAL_char:
	{
		RefASTNodeExt tmp6_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_char);
		_t = _t->getNextSibling();
#line 364 "syntax.g"
		
					t.SetType(CHAR_T);			
				
#line 248 "DataASTParser.cpp"
		break;
	}
	case LITERAL_string:
	{
		RefASTNodeExt tmp7_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_string);
		_t = _t->getNextSibling();
#line 368 "syntax.g"
		
					t.SetType(STR_T);			
				
#line 260 "DataASTParser.cpp"
		break;
	}
	case 32:
	{
		RefASTNodeExt tmp8_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),32);
		_t = _t->getNextSibling();
#line 372 "syntax.g"
		
					t.SetType(UINT16_T);			
				
#line 272 "DataASTParser.cpp"
		break;
	}
	case 33:
	{
		RefASTNodeExt tmp9_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),33);
		_t = _t->getNextSibling();
#line 376 "syntax.g"
		
					t.SetType(INT16_T);			
				
#line 284 "DataASTParser.cpp"
		break;
	}
	case LITERAL_int:
	{
		RefASTNodeExt tmp10_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_int);
		_t = _t->getNextSibling();
#line 380 "syntax.g"
		
					t.SetType(INT_T);			
				
#line 296 "DataASTParser.cpp"
		break;
	}
	case LITERAL_uint:
	{
		RefASTNodeExt tmp11_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_uint);
		_t = _t->getNextSibling();
#line 384 "syntax.g"
		
					t.SetType(UINT_T);			
				
#line 308 "DataASTParser.cpp"
		break;
	}
	case LITERAL_float:
	{
		RefASTNodeExt tmp12_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_float);
		_t = _t->getNextSibling();
#line 388 "syntax.g"
		
					t.SetType(FLOOT_T);			
				
#line 320 "DataASTParser.cpp"
		break;
	}
	case LITERAL_double:
	{
		RefASTNodeExt tmp13_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_double);
		_t = _t->getNextSibling();
#line 392 "syntax.g"
		
					t.SetType(DOUBLE_T);			
				
#line 332 "DataASTParser.cpp"
		break;
	}
	case LITERAL_bool:
	{
		RefASTNodeExt tmp14_AST_in = _t;
		match(ANTLR_USE_NAMESPACE(antlr)RefAST(_t),LITERAL_bool);
		_t = _t->getNextSibling();
#line 396 "syntax.g"

⌨️ 快捷键说明

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