|
60 | 60 | #ifdef FTN_BLK_DATA |
61 | 61 | static void block_data_list(const gpre_dbb*); |
62 | 62 | #endif |
| 63 | +static bool is_gpre_action_context(); |
63 | 64 | static bool match_parentheses(); |
64 | 65 | static act* par_any(); |
65 | 66 | static act* par_array_element(); |
@@ -141,6 +142,13 @@ act* PAR_action(const TEXT* base_dir) |
141 | 142 | gpreGlob.token_global.tok_keyword <= KW_end_actions) |
142 | 143 | { |
143 | 144 | const kwwords_t keyword = gpreGlob.token_global.tok_keyword; |
| 145 | + |
| 146 | + if (!is_gpre_action_context()) |
| 147 | + { |
| 148 | + gpreGlob.token_global.tok_symbol = NULL; |
| 149 | + return NULL; |
| 150 | + } |
| 151 | + |
144 | 152 | if (! gpreGlob.sw_no_qli) |
145 | 153 | { |
146 | 154 | switch (keyword) |
@@ -1253,6 +1261,67 @@ static void block_data_list( const gpre_dbb* db) |
1253 | 1261 | #endif |
1254 | 1262 |
|
1255 | 1263 |
|
| 1264 | +//____________________________________________________________ |
| 1265 | +// |
| 1266 | +// In Firebird's internal C++ preprocessor mode, GPRE action |
| 1267 | +// keywords may also appear as regular C++ identifiers. Treat |
| 1268 | +// them as commands only where a standalone embedded command can |
| 1269 | +// reasonably start. |
| 1270 | +// |
| 1271 | + |
| 1272 | +static bool is_gpre_action_context() |
| 1273 | +{ |
| 1274 | + if (gpreGlob.sw_language != lang_internal) |
| 1275 | + return true; |
| 1276 | + |
| 1277 | + switch (gpreGlob.token_global.tok_keyword) |
| 1278 | + { |
| 1279 | + case KW_L_BRACE: |
| 1280 | + case KW_R_BRACE: |
| 1281 | + return true; |
| 1282 | + |
| 1283 | + default: |
| 1284 | + break; |
| 1285 | + } |
| 1286 | + |
| 1287 | + if (gpreGlob.token_global.tok_first) |
| 1288 | + { |
| 1289 | + switch (gpreGlob.prior_token.tok_keyword) |
| 1290 | + { |
| 1291 | + case KW_EQUALS: |
| 1292 | + case KW_COMMA: |
| 1293 | + case KW_DOT: |
| 1294 | + case KW_POINTS: |
| 1295 | + case KW_LEFT_PAREN: |
| 1296 | + case KW_L_BRCKET: |
| 1297 | + case KW_PLUS: |
| 1298 | + case KW_MINUS: |
| 1299 | + case KW_ASTERISK: |
| 1300 | + case KW_SLASH: |
| 1301 | + return false; |
| 1302 | + |
| 1303 | + default: |
| 1304 | + return true; |
| 1305 | + } |
| 1306 | + } |
| 1307 | + |
| 1308 | + switch (gpreGlob.prior_token.tok_keyword) |
| 1309 | + { |
| 1310 | + case KW_none: |
| 1311 | + return !gpreGlob.prior_token.tok_symbol && gpreGlob.prior_token.tok_length == 0; |
| 1312 | + |
| 1313 | + case KW_SEMI_COLON: |
| 1314 | + case KW_L_BRACE: |
| 1315 | + case KW_R_BRACE: |
| 1316 | + case KW_RIGHT_PAREN: |
| 1317 | + return true; |
| 1318 | + |
| 1319 | + default: |
| 1320 | + return false; |
| 1321 | + } |
| 1322 | +} |
| 1323 | + |
| 1324 | + |
1256 | 1325 | //____________________________________________________________ |
1257 | 1326 | // |
1258 | 1327 | // |
@@ -3334,4 +3403,3 @@ static bool terminator() |
3334 | 3403 |
|
3335 | 3404 | return false; |
3336 | 3405 | } |
3337 | | - |
|
0 commit comments