source: dev/BasicCompiler_Common/TypeDef.cpp@ 78

Last change on this file since 78 was 78, checked in by dai_9181, 17 years ago

CTypeDef → TypeDef
Houseクラスを追加。
オーバーロードレベルの種類を追加(レベル1に挿入)

File size: 3.3 KB
RevLine 
[78]1#include "common.h"
[4]2
3
[78]4TypeDef::TypeDef( const string &newName, const string &baseName ):
5 newName( newName ),
6 baseName( baseName )
7{
8 if( !Type::StringToType( baseName, baseType ) ){
9 SetError(3, baseName, cp );
10 return;
11 }
[4]12}
[78]13TypeDef::~TypeDef(){
[4]14}
15
16
[78]17TypeDefCollection::TypeDefCollection(){
[4]18}
[78]19TypeDefCollection::~TypeDefCollection(){
[4]20}
[78]21void TypeDefCollection::Add( const string &newName, const string &baseName ){
22 TypeDef typeDef( newName, baseName );
23 this->push_back( typeDef );
[4]24
25
[78]26 /*
27 TODO: 消す1
[4]28 ////////////////////////
29 // 循環参照をチェック
30 ////////////////////////
31
32 int i;
[78]33 string tempName = newName;
[4]34
35 while(1){
[78]36 i=GetIndex( tempName );
[4]37 if(i==-1) break;
38
[78]39 if( (*this)[i].baseName == newName ){
[4]40 //循環エラー
41 extern int cp;
42 SetError(124,NULL,cp);
43
44 //不明な型として、Long型を指定しておく
[78]45 (*this)[i].baseName = "Long";
[4]46
47 break;
48 }
49
[78]50 tempName = (*this)[i].baseName;
51 }*/
[4]52}
[78]53int TypeDefCollection::GetIndex( const string &typeName ) const{
54 int max = (*this).size();
55 for( int i=0; i<max; i++ ){
56 if( (*this)[i].newName == typeName ){
[4]57 return i;
58 }
59 }
60 return -1;
61}
62
[78]63void TypeDefCollection::Add( const string &expression, int nowLine ){
[4]64 int i;
[78]65 char temporary[VN_SIZE];
[4]66
67 for(i=0;;i++){
[78]68 if(expression[i]=='='||expression[i]=='\0'){
[4]69 temporary[i]=0;
70 break;
71 }
[78]72 temporary[i]=expression[i];
[4]73 }
74
[78]75 if(expression[i]!='='){
76 SetError(10,"TypeDef",nowLine);
[4]77 return;
78 }
79
[78]80 const char *pTemp=expression.c_str()+i+1;
[4]81
82 //識別文字のエラーチェック(新しい型)
83 i=0;
84 for(;;i++){
85 if(temporary[i]=='\0') break;
86 if(!IsVariableChar(temporary[i])){
[78]87 SetError(10,"TypeDef",nowLine);
[4]88 return;
89 }
90 }
91
92 //識別文字のエラーチェック(コピー元の型)
93 if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){
94 //関数ポインタ
95 if(pTemp[3]!='('){
[78]96 SetError(10,"TypeDef",nowLine);
[4]97 return;
98 }
99 }
100 else{
101 i=0;
102 while(pTemp[i]=='*') i++;
103 for(;;i++){
104 if(pTemp[i]=='\0') break;
105 if(!IsVariableChar(pTemp[i])){
[78]106 SetError(10,"TypeDef",nowLine);
[4]107 return;
108 }
109 }
110 }
111
112 //識別子が重複している場合はエラーにする
113 if(lstrcmp(temporary,pTemp)==0){
[78]114 SetError(1,NULL,nowLine);
[4]115 return;
116 }
117
118
119
120 //////////////////////////
121 // TypeDef情報を追加
122 //////////////////////////
[78]123
124 //エラー用
125 extern int cp;
126 cp = nowLine;
127
128 House::typeDefs.Add(temporary,pTemp);
[4]129}
[78]130
131void TypeDefCollection::Init(){
132 // 初期化
133 clear();
134
135 int i=-1;
136 while(1){
137 i++;
138
139 extern char *basbuf;
140 if( basbuf[i]==1 ){
141 char temporary[VN_SIZE];
142 if(basbuf[i+1]==ESC_TYPEDEF){
143 int i2 = 0;
144 for(i+=2;;i2++,i++){
145 if(basbuf[i]=='\n'){
146 temporary[i2]=0;
147 break;
148 }
149 temporary[i2]=basbuf[i];
150 if(basbuf[i]=='\0') break;
151 }
152 Add(temporary,i);
153
154 continue;
155 }
156 else if( basbuf[i+1] == ESC_CONST && basbuf[i+2] == 1 && basbuf[i+3] == ESC_ENUM ){
157 int i2 = 0;
158 for(i+=4;;i2++,i++){
159 if(!IsVariableChar(basbuf[i])){
160 temporary[i2]=0;
161 break;
162 }
163 temporary[i2]=basbuf[i];
164 if(basbuf[i]=='\0') break;
165 }
166 House::typeDefs.Add(temporary,"Long");
167 }
168 }
169
170 //次の行
171 for(;;i++){
172 if(IsCommandDelimitation(basbuf[i])) break;
173 }
174 if(basbuf[i]=='\0') break;
175 }
176}
Note: See TracBrowser for help on using the repository browser.