source: dev/trunk/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_TypeDef.cpp@ 668

Last change on this file since 668 was 668, checked in by dai_9181, 16 years ago

NamespaceSupporter::ClearImportedNamespacesを追加。
NamespaceSupporter::GetImportedNamespacesをconstにした。

File size: 4.1 KB
Line 
1#include "stdafx.h"
2
3using namespace ActiveBasic::Compiler;
4
5void LexicalAnalyzer::AddTypeDef( TypeDefCollection &typeDefs, const NamespaceScopes &namespaceScopes, const std::string &expression, int nowLine )
6{
7 int i;
8 char temporary[VN_SIZE];
9
10 for(i=0;;i++){
11 if(expression[i]=='='||expression[i]=='\0'){
12 temporary[i]=0;
13 break;
14 }
15 temporary[i]=expression[i];
16 }
17
18 if(expression[i]!='='){
19 compiler.errorMessenger.Output(10,"TypeDef",nowLine);
20 return;
21 }
22
23 const char *pTemp=expression.c_str()+i+1;
24
25 //識別文字のエラーチェック(新しい型)
26 i=0;
27 for(;;i++){
28 if(temporary[i]=='\0') break;
29 if( !( IsVariableChar( temporary[i], true) ) ){
30 compiler.errorMessenger.Output(10,"TypeDef",nowLine);
31 return;
32 }
33 }
34
35 //識別文字のエラーチェック(コピー元の型)
36 if(pTemp[0]=='*'&&pTemp[1]==1&&(pTemp[2]==ESC_FUNCTION||pTemp[2]==ESC_SUB)){
37 //関数ポインタ
38 if(pTemp[3]!='('){
39 compiler.errorMessenger.Output(10,"TypeDef",nowLine);
40 return;
41 }
42 }
43 else{
44 i=0;
45 while(pTemp[i]=='*') i++;
46 for(;;i++){
47 if(pTemp[i]=='\0') break;
48 if( !( IsVariableChar( pTemp[i], true) ) )
49 {
50 compiler.errorMessenger.Output(10,"TypeDef",nowLine);
51 return;
52 }
53 }
54 }
55
56 //識別子が重複している場合はエラーにする
57 if(lstrcmp(temporary,pTemp)==0){
58 compiler.errorMessenger.Output(1,NULL,nowLine);
59 return;
60 }
61
62
63
64 //////////////////////////
65 // TypeDef情報を追加
66 //////////////////////////
67
68 Type baseType;
69 if( !compiler.StringToType( pTemp, baseType ) )
70 {
71 compiler.errorMessenger.Output(3, pTemp, nowLine );
72 return;
73 }
74
75 typeDefs.push_back(
76 TypeDef(
77 Symbol( namespaceScopes, temporary ),
78 pTemp,
79 baseType
80 )
81 );
82}
83void LexicalAnalyzer::CollectTypeDefs( const char *source, TypeDefCollection &typeDefs )
84{
85 // 名前空間管理
86 NamespaceScopes &namespaceScopes = compiler.GetNamespaceSupporter().GetLivingNamespaceScopes();
87 namespaceScopes.clear();
88
89 // Imports情報のクリア
90 compiler.GetNamespaceSupporter().ClearImportedNamespaces();
91
92 int i=-1, i2;
93 char temporary[VN_SIZE];
94 while(1){
95
96 i++;
97
98 if( source[i] == 1 && source[i+1] == ESC_NAMESPACE ){
99 for(i+=2,i2=0;;i2++,i++){
100 if( IsCommandDelimitation( source[i] ) ){
101 temporary[i2]=0;
102 break;
103 }
104 temporary[i2]=source[i];
105 }
106 namespaceScopes.push_back( temporary );
107
108 continue;
109 }
110 else if( source[i] == 1 && source[i+1] == ESC_ENDNAMESPACE ){
111 if( namespaceScopes.size() <= 0 ){
112 compiler.errorMessenger.Output(12, "End Namespace", i );
113 }
114 else{
115 namespaceScopes.pop_back();
116 }
117
118 i += 2;
119 continue;
120 }
121 else if( source[i] == 1 && source[i+1] == ESC_IMPORTS ){
122 for(i+=2,i2=0;;i2++,i++){
123 if( IsCommandDelimitation( source[i] ) ){
124 temporary[i2]=0;
125 break;
126 }
127 temporary[i2]=source[i];
128 }
129 if( !compiler.GetNamespaceSupporter().ImportsNamespace( temporary ) )
130 {
131 compiler.errorMessenger.Output(64,temporary,i );
132 }
133
134 continue;
135 }
136 else if( source[i] == 1 && source[i+1] == ESC_CLEARNAMESPACEIMPORTED )
137 {
138 // Imports情報のクリア
139 compiler.GetNamespaceSupporter().ClearImportedNamespaces();
140 continue;
141 }
142
143 if( source[i]==1 ){
144 char temporary[VN_SIZE];
145 if(source[i+1]==ESC_TYPEDEF){
146 int i2 = 0;
147 for(i+=2;;i2++,i++){
148 if(source[i]=='\n'){
149 temporary[i2]=0;
150 break;
151 }
152 temporary[i2]=source[i];
153 if(source[i]=='\0') break;
154 }
155 AddTypeDef( typeDefs, namespaceScopes, temporary, i );
156
157 continue;
158 }
159 else if( source[i+1] == ESC_CONST && source[i+2] == 1 && source[i+3] == ESC_ENUM ){
160 int i2 = 0;
161 for(i+=4;;i2++,i++){
162 if(!IsVariableChar(source[i])){
163 temporary[i2]=0;
164 break;
165 }
166 temporary[i2]=source[i];
167 if(source[i]=='\0') break;
168 }
169
170 Type baseType;
171 if( !compiler.StringToType( "Long", baseType ) )
172 {
173 throw;
174 }
175
176 typeDefs.push_back(
177 TypeDef(
178 Symbol( namespaceScopes, temporary ),
179 "Long",
180 baseType
181 )
182 );
183 }
184 }
185
186 //次の行
187 for(;;i++){
188 if(IsCommandDelimitation(source[i])) break;
189 }
190 if(source[i]=='\0') break;
191 }
192}
Note: See TracBrowser for help on using the repository browser.