📄 stc.c
字号:
ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_DO_BLOCK_END); ffebad_here (0, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_here (1, ffestw_line (ffestw_stack_top ()), ffestw_col (ffestw_stack_top ())); ffebad_here (2, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); break; } ffestd_labeldef_branch (ffestc_label_); /* Leave something around for _branch_end_() to handle. */ return; case FFELAB_typeFORMAT: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); break; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* Define possible end of labeled-DO-loop. Call only after calling ffestc_labeldef_branch_begin_, or when other branch_* functions recognize that a label might also be serving as a branch end (in which case they must issue a diagnostic). */static voidffestc_labeldef_branch_end_ (){ if (ffesta_label_token == NULL) return; assert (ffestc_label_ != NULL); assert ((ffelab_type (ffestc_label_) == FFELAB_typeLOOPEND) || (ffelab_type (ffestc_label_) == FFELAB_typeANY)); while ((ffestw_state (ffestw_stack_top ()) == FFESTV_stateDO) && (ffestw_label (ffestw_stack_top ()) == ffestc_label_)) ffestc_shriek_do_ (TRUE); ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* ffestc_labeldef_endif_ -- Define label as an END IF one ffestc_labeldef_endif_(); */static voidffestc_labeldef_endif_ (){ if ((ffesta_label_token == NULL) || (ffestc_shriek_after1_ != NULL) || !ffestc_labeldef_begin_ ()) return; switch (ffelab_type (ffestc_label_)) { case FFELAB_typeUNKNOWN: case FFELAB_typeASSIGNABLE: ffelab_set_type (ffestc_label_, FFELAB_typeENDIF); ffelab_set_blocknum (ffestc_label_, ffestw_blocknum (ffestw_previous (ffestw_stack_top ()))); ffestd_labeldef_endif (ffestc_label_); break; case FFELAB_typeNOTLOOP: if (ffelab_blocknum (ffestc_label_) < ffestw_blocknum (ffestw_previous (ffestw_stack_top ()))) { ffebad_start (FFEBAD_LABEL_BLOCK); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); } ffelab_set_blocknum (ffestc_label_, ffestw_blocknum (ffestw_previous (ffestw_stack_top ()))); ffestd_labeldef_endif (ffestc_label_); break; case FFELAB_typeLOOPEND: if ((ffestw_state (ffestw_stack_top ()) != FFESTV_stateDO) || (ffestw_label (ffestw_stack_top ()) != ffestc_label_)) { /* Unterminated block. */ ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_DO_BLOCK_END); ffebad_here (0, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_here (1, ffestw_line (ffestw_stack_top ()), ffestw_col (ffestw_stack_top ())); ffebad_here (2, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); break; } ffestd_labeldef_endif (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_finish (); ffestc_labeldef_branch_end_ (); return; case FFELAB_typeFORMAT: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); break; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* ffestc_labeldef_format_ -- Define label as a FORMAT one ffestc_labeldef_format_(); */static voidffestc_labeldef_format_ (){ if ((ffesta_label_token == NULL) || (ffestc_shriek_after1_ != NULL)) { ffebad_start (FFEBAD_FORMAT_NO_LABEL_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]), ffelex_token_where_column (ffesta_tokens[0])); ffebad_finish (); return; } if (!ffestc_labeldef_begin_ ()) return; switch (ffelab_type (ffestc_label_)) { case FFELAB_typeUNKNOWN: case FFELAB_typeASSIGNABLE: ffelab_set_type (ffestc_label_, FFELAB_typeFORMAT); ffestd_labeldef_format (ffestc_label_); break; case FFELAB_typeFORMAT: ffestd_labeldef_format (ffestc_label_); break; case FFELAB_typeLOOPEND: if ((ffestw_state (ffestw_stack_top ()) != FFESTV_stateDO) || (ffestw_label (ffestw_stack_top ()) != ffestc_label_)) { /* Unterminated block. */ ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_DO_BLOCK_END); ffebad_here (0, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_here (1, ffestw_line (ffestw_stack_top ()), ffestw_col (ffestw_stack_top ())); ffebad_here (2, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); break; } ffestd_labeldef_format (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_finish (); ffestc_labeldef_branch_end_ (); return; case FFELAB_typeNOTLOOP: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); break; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* ffestc_labeldef_invalid_ -- Label definition invalid, complain if present ffestc_labeldef_invalid_(); */static voidffestc_labeldef_invalid_ (){ if ((ffesta_label_token == NULL) || (ffestc_shriek_after1_ != NULL) || !ffestc_labeldef_begin_ ()) return; ffebad_start (FFEBAD_INVALID_LABEL_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* Define label as a non-loop-ending one on a statement that can't be in the "then" part of a logical IF, such as a block-IF statement. */static voidffestc_labeldef_notloop_ (){ if (ffesta_label_token == NULL) return; assert (ffestc_shriek_after1_ == NULL); if (!ffestc_labeldef_begin_ ()) return; switch (ffelab_type (ffestc_label_)) { case FFELAB_typeUNKNOWN: case FFELAB_typeASSIGNABLE: ffelab_set_type (ffestc_label_, FFELAB_typeNOTLOOP); ffelab_set_blocknum (ffestc_label_, ffestw_blocknum (ffestw_stack_top ())); ffestd_labeldef_notloop (ffestc_label_); break; case FFELAB_typeNOTLOOP: if (ffelab_blocknum (ffestc_label_) < ffestw_blocknum (ffestw_stack_top ())) { ffebad_start (FFEBAD_LABEL_BLOCK); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); } ffelab_set_blocknum (ffestc_label_, ffestw_blocknum (ffestw_stack_top ())); ffestd_labeldef_notloop (ffestc_label_); break; case FFELAB_typeLOOPEND: if ((ffestw_state (ffestw_stack_top ()) != FFESTV_stateDO) || (ffestw_label (ffestw_stack_top ()) != ffestc_label_)) { /* Unterminated block. */ ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_DO_BLOCK_END); ffebad_here (0, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_here (1, ffestw_line (ffestw_stack_top ()), ffestw_col (ffestw_stack_top ())); ffebad_here (2, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); break; } ffestd_labeldef_notloop (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_finish (); ffestc_labeldef_branch_end_ (); return; case FFELAB_typeFORMAT: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); break; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;}/* Define label as a non-loop-ending one. Use this when it is possible that the pending label is inhibited because we're in the midst of a logical-IF, and thus _branch_end_ is going to be called after the current statement to resolve a potential loop-ending label. */static voidffestc_labeldef_notloop_begin_ (){ if ((ffesta_label_token == NULL) || (ffestc_shriek_after1_ != NULL) || !ffestc_labeldef_begin_ ()) return; switch (ffelab_type (ffestc_label_)) { case FFELAB_typeUNKNOWN: case FFELAB_typeASSIGNABLE: ffelab_set_type (ffestc_label_, FFELAB_typeNOTLOOP); ffelab_set_blocknum (ffestc_label_, ffestw_blocknum (ffestw_stack_top ())); ffestd_labeldef_notloop (ffestc_label_); break; case FFELAB_typeNOTLOOP: if (ffelab_blocknum (ffestc_label_) < ffestw_blocknum (ffestw_stack_top ())) { ffebad_start (FFEBAD_LABEL_BLOCK); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); } ffelab_set_blocknum (ffestc_label_, ffestw_blocknum (ffestw_stack_top ())); ffestd_labeldef_notloop (ffestc_label_); break; case FFELAB_typeLOOPEND: if ((ffestw_state (ffestw_stack_top ()) != FFESTV_stateDO) || (ffestw_label (ffestw_stack_top ()) != ffestc_label_)) { /* Unterminated block. */ ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_DO_BLOCK_END); ffebad_here (0, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_here (1, ffestw_line (ffestw_stack_top ()), ffestw_col (ffestw_stack_top ())); ffebad_here (2, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_finish (); break; } ffestd_labeldef_branch (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_doref_line (ffestc_label_), ffelab_doref_column (ffestc_label_)); ffebad_finish (); return; case FFELAB_typeFORMAT: ffelab_set_type (ffestc_label_, FFELAB_typeANY); ffestd_labeldef_any (ffestc_label_); ffebad_start (FFEBAD_LABEL_USE_DEF); ffebad_here (0, ffelex_token_where_line (ffesta_label_token), ffelex_token_where_column (ffesta_label_token)); ffebad_here (1, ffelab_firstref_line (ffestc_label_), ffelab_firstref_column (ffestc_label_)); ffebad_finish (); break; default: assert ("bad label" == NULL); /* Fall through. */ case FFELAB_typeANY: break; } ffestc_try_shriek_do_ (); ffelex_token_kill (ffesta_label_token); ffesta_label_token = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -