如何在基于flex/bison的解析器中识别单个换行符并忽略多个换行符
问题根因
你当前的规则写法存在正则语法错误:[\n{1}]中,方括号[]代表匹配内部列举的任意单个字符,写在内部的{1}不会被识别为量词,只会被当做普通字符{、1、}处理,这条规则实际匹配的是换行、左大括号、数字1、右大括号四个字符中的任意一个,完全不符合预期。
可行解决方案
1. 词法分析器(Flex)规则调整
利用Flex最长匹配优先的规则特性,按如下顺序配置换行相关规则即可实现需求:
/* 优先匹配2个及以上的连续换行,直接忽略 */ \n\n+ {} /* 仅匹配单个换行时,返回换行token */ \n { return '\n'; }
如果你的场景中允许换行之间夹杂空格、制表符等空白字符也判定为连续换行,可以调整规则为:
/* 匹配2个及以上换行,中间可夹杂任意空白字符,直接忽略 */ \n[[:space:]]*\n+ {} \n { return '\n'; }
2. 语法分析器(Bison)适配
因为仅指定场景需要识别换行,你可以按需在对应语法规则中显式匹配\n token即可,比如定义语句的规则可以写为:
def_stmt: type IDENTIFIER ';' '\n' { // 定义语句的处理逻辑 };
如果你使用的是Bison 3.3及以上版本,也可以在不需要换行的语法场景下通过%ignore '\n'配置自动忽略非必要的换行token,不需要额外调整语法规则。
内容的提问来源于stack exchange,提问作者George Kylo
相关产品推荐
相关产品推荐

