Bison语法中dangling else(悬空else)冲突正确消除方法咨询
错误点梳理
你第二次修改的方向是正确的,出现冲突是两个低级错误导致的:
- 分类逻辑重复:普通非分支语句(表达式语句、复合语句、跳转语句)本身不存在悬挂else的可能,天然属于闭合语句,不需要单独作为
other和matched、unmatched并列,重复分类直接导致reduce/reduce冲突 - DO-WHILE规则放错位置:DO-WHILE结尾有明确的分号终结符,不管内部嵌套的语句是什么,本身都是闭合结构,不能出现在非闭合迭代语句的规则里
核心原理
悬空else的本质是文法允许else匹配多个if,要消除冲突就必须强制else优先和最近的未匹配if绑定:只要if后面要接else,那if的then分支必须是不存在未匹配if的闭合语句,从规则上杜绝else匹配更外层if的可能。
修正后的无冲突语法规则
statement: matched | unmatched ; // 闭合语句:不存在未匹配的if,没有悬挂else的可能 matched: expression_statement | compound_statement | jump_statement | selection_statement_c | iteration_statement_c ; // 非闭合语句:存在未匹配的if,有悬挂else的可能 unmatched: selection_statement_o | iteration_statement_o ; selection_statement_c: // 两个分支都是闭合语句,整个if结构完全匹配 IF LPAR expression RPAR matched ELSE matched ; selection_statement_o: // 没有else的if,本身是非闭合结构 IF LPAR expression RPAR statement // else分支是非闭合结构,整个if结构仍然存在未匹配项 | IF LPAR expression RPAR matched ELSE unmatched ; iteration_statement_c: WHILE LPAR expression RPAR matched // DO-WHILE天然是闭合结构,不需要区分内部语句类型 | DO statement WHILE LPAR expression RPAR SEMIC | FOR LPAR expression_opt SEMIC expression_opt SEMIC expression_opt RPAR matched ; iteration_statement_o: WHILE LPAR expression RPAR unmatched | FOR LPAR expression_opt SEMIC expression_opt SEMIC expression_opt RPAR unmatched ;
内容的提问来源于stack exchange,提问作者Riomare
相关产品推荐
相关产品推荐

