Bison中如何仅用语法规则限制break/continue仅在循环内使用?
仅用Bison规则限制BREAK/CONTINUE仅在循环内使用的方法
可以通过拆分非终结符,利用Bison的上下文敏感语法特性实现,不需要全局变量,也不用完全复制语法:
核心思路是定义两套语句非终结符:一套用于循环外的顶层环境(不允许BREAK/CONTINUE),另一套用于循环内环境(允许所有顶层语句+ BREAK/CONTINUE),让循环结构内部引用循环内的语句规则,顶层引用循环外的规则,同时复用已有规则避免重复代码。
具体修改后的Bison代码如下:
%start top_statements %% // 顶层语句集合:仅允许循环、WRITE等,不包含BREAK/CONTINUE top_statements: /* 空 */ | top_statement top_statements top_statement: loop | WRITE | ... // 这里写循环外允许的所有语句 // 循环内语句集合:继承顶层语句的所有规则,额外添加BREAK和CONTINUE loop_statements: /* 空 */ | loop_statement loop_statements loop_statement: top_statement | BREAK | CONTINUE // 循环结构:内部使用循环内的语句集合 loop: WHILE condition loop_statements ENDWHILE condition: ... %%
为什么这个方法可行?
- 语法规则本身就明确了语句的合法环境:顶层只能用
top_statement(没有BREAK/CONTINUE),而循环内部用loop_statement(包含所有合法语句+BREAK/CONTINUE)。 - 不需要重复写大量规则:
loop_statement直接复用了top_statement的所有定义,只新增两个允许的语句,符合你“无需完全复制语法”的要求。 - 完全基于Bison语法规则实现,不需要额外的C变量和语义检查代码,比全局计数的方案更优雅。
内容的提问来源于stack exchange,提问作者DYZ
相关产品推荐
相关产品推荐

