如何编写Lex规则识别制表符并允许空白空格?
解决Lex规则的需求问题
问题根源
你之前的规则[ \t] {yylval.str=strdup(yytext); return TAB;}把单个空格和制表符都统一返回TAB token,但你的Yacc语法规则里并没有在x=和5这类位置接受TAB的逻辑,所以输入带单个空格时Yacc会报错。
符合需求的Lex规则
按照你的要求——识别原生制表符、把4个连续空格视为制表符,同时允许单词间的单个/非4连续空格(直接忽略,不传递给Yacc),可以这样写规则:
/* 先匹配4个连续空格,优先级高于单个空格 */ " " { yylval.str = strdup(yytext); return TAB; } /* 匹配原生制表符 */ \t { yylval.str = strdup(yytext); return TAB; } /* 匹配1-3个连续空格,直接忽略,不返回任何token */ [ ]+ { }
关键说明
- 规则顺序不能乱:Lex会优先匹配最长、最靠前的规则,所以必须把4个空格的规则放在单个空格规则前面,否则4个空格会被拆成四次单个空格匹配,无法触发制表符逻辑。
- 空格的处理逻辑:单个/非4连续空格直接忽略,这样Yacc接收到的token流和无空格的情况一致(比如
x= 5会被处理成x=+5),自然不会报错。 - 内存注意事项:
strdup会分配堆内存,在Yacc中处理完TABtoken后记得调用free(yylval.str),避免内存泄漏。
内容的提问来源于stack exchange,提问作者Seb Seb
相关产品推荐
相关产品推荐

