@@ -24,8 +24,7 @@ std::optional<CompilationError> Analyser::analyseProgram() {
24
24
25
25
// <主过程>
26
26
auto err = analyseMain ();
27
- if (err.has_value ())
28
- return err;
27
+ if (err.has_value ()) return err;
29
28
30
29
// 'end'
31
30
auto ed = nextToken ();
@@ -57,8 +56,7 @@ std::optional<CompilationError> Analyser::analyseConstantDeclaration() {
57
56
while (true ) {
58
57
// 预读一个 token,不然不知道是否应该用 <常量声明> 推导
59
58
auto next = nextToken ();
60
- if (!next.has_value ())
61
- return {};
59
+ if (!next.has_value ()) return {};
62
60
// 如果是 const 那么说明应该推导 <常量声明> 否则直接返回
63
61
if (next.value ().GetType () != TokenType::CONST) {
64
62
unreadToken ();
@@ -84,8 +82,7 @@ std::optional<CompilationError> Analyser::analyseConstantDeclaration() {
84
82
// <常表达式>
85
83
int32_t val;
86
84
auto err = analyseConstantExpression (val);
87
- if (err.has_value ())
88
- return err;
85
+ if (err.has_value ()) return err;
89
86
90
87
// ';'
91
88
next = nextToken ();
@@ -130,8 +127,7 @@ std::optional<CompilationError> Analyser::analyseStatementSequence() {
130
127
while (true ) {
131
128
// 预读
132
129
auto next = nextToken ();
133
- if (!next.has_value ())
134
- return {};
130
+ if (!next.has_value ()) return {};
135
131
unreadToken ();
136
132
if (next.value ().GetType () != TokenType::IDENTIFIER &&
137
133
next.value ().GetType () != TokenType::PRINT &&
@@ -140,19 +136,19 @@ std::optional<CompilationError> Analyser::analyseStatementSequence() {
140
136
}
141
137
std::optional<CompilationError> err;
142
138
switch (next.value ().GetType ()) {
143
- // 这里需要你针对不同的预读结果来调用不同的子程序
144
- // 注意我们没有针对空语句单独声明一个函数,因此可以直接在这里返回
145
- default :
146
- break ;
139
+ // 这里需要你针对不同的预读结果来调用不同的子程序
140
+ // 注意我们没有针对空语句单独声明一个函数,因此可以直接在这里返回
141
+ default :
142
+ break ;
147
143
}
148
144
}
149
145
return {};
150
146
}
151
147
152
148
// <常表达式> ::= [<符号>]<无符号整数>
153
149
// 需要补全
154
- std::optional<CompilationError>
155
- Analyser::analyseConstantExpression ( int32_t &out) {
150
+ std::optional<CompilationError> Analyser::analyseConstantExpression (
151
+ int32_t &out) {
156
152
// out 是常表达式的结果
157
153
// 这里你要分析常表达式并且计算结果
158
154
// 注意以下均为常表达式
@@ -165,15 +161,13 @@ Analyser::analyseConstantExpression(int32_t &out) {
165
161
std::optional<CompilationError> Analyser::analyseExpression () {
166
162
// <项>
167
163
auto err = analyseItem ();
168
- if (err.has_value ())
169
- return err;
164
+ if (err.has_value ()) return err;
170
165
171
166
// {<加法型运算符><项>}
172
167
while (true ) {
173
168
// 预读
174
169
auto next = nextToken ();
175
- if (!next.has_value ())
176
- return {};
170
+ if (!next.has_value ()) return {};
177
171
auto type = next.value ().GetType ();
178
172
if (type != TokenType::PLUS_SIGN && type != TokenType::MINUS_SIGN) {
179
173
unreadToken ();
@@ -182,8 +176,7 @@ std::optional<CompilationError> Analyser::analyseExpression() {
182
176
183
177
// <项>
184
178
err = analyseItem ();
185
- if (err.has_value ())
186
- return err;
179
+ if (err.has_value ()) return err;
187
180
188
181
// 根据结果生成指令
189
182
if (type == TokenType::PLUS_SIGN)
@@ -217,8 +210,7 @@ std::optional<CompilationError> Analyser::analyseOutputStatement() {
217
210
218
211
// <表达式>
219
212
auto err = analyseExpression ();
220
- if (err.has_value ())
221
- return err;
213
+ if (err.has_value ()) return err;
222
214
223
215
// ')'
224
216
next = nextToken ();
@@ -267,31 +259,28 @@ std::optional<CompilationError> Analyser::analyseFactor() {
267
259
return std::make_optional<CompilationError>(
268
260
_current_pos, ErrorCode::ErrIncompleteExpression);
269
261
switch (next.value ().GetType ()) {
270
- // 这里和 <语句序列> 类似,需要根据预读结果调用不同的子程序
271
- // 但是要注意 default 返回的是一个编译错误
272
- default :
273
- return std::make_optional<CompilationError>(
274
- _current_pos, ErrorCode::ErrIncompleteExpression);
262
+ // 这里和 <语句序列> 类似,需要根据预读结果调用不同的子程序
263
+ // 但是要注意 default 返回的是一个编译错误
264
+ default :
265
+ return std::make_optional<CompilationError>(
266
+ _current_pos, ErrorCode::ErrIncompleteExpression);
275
267
}
276
268
277
269
// 取负
278
- if (prefix == -1 )
279
- _instructions.emplace_back (Operation::SUB, 0 );
270
+ if (prefix == -1 ) _instructions.emplace_back (Operation::SUB, 0 );
280
271
return {};
281
272
}
282
273
283
274
std::optional<Token> Analyser::nextToken () {
284
- if (_offset == _tokens.size ())
285
- return {};
275
+ if (_offset == _tokens.size ()) return {};
286
276
// 考虑到 _tokens[0..._offset-1] 已经被分析过了
287
277
// 所以我们选择 _tokens[0..._offset-1] 的 EndPos 作为当前位置
288
278
_current_pos = _tokens[_offset].GetEndPos ();
289
279
return _tokens[_offset++];
290
280
}
291
281
292
282
void Analyser::unreadToken () {
293
- if (_offset == 0 )
294
- DieAndPrint (" analyser unreads token from the begining." );
283
+ if (_offset == 0 ) DieAndPrint (" analyser unreads token from the begining." );
295
284
_current_pos = _tokens[_offset - 1 ].GetEndPos ();
296
285
_offset--;
297
286
}
@@ -335,4 +324,4 @@ bool Analyser::isInitializedVariable(const std::string &s) {
335
324
bool Analyser::isConstant (const std::string &s) {
336
325
return _consts.find (s) != _consts.end ();
337
326
}
338
- } // namespace miniplc0
327
+ } // namespace miniplc0
0 commit comments