You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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 */
[ ]+            { }

关键说明

  1. 规则顺序不能乱:Lex会优先匹配最长、最靠前的规则,所以必须把4个空格的规则放在单个空格规则前面,否则4个空格会被拆成四次单个空格匹配,无法触发制表符逻辑。
  2. 空格的处理逻辑:单个/非4连续空格直接忽略,这样Yacc接收到的token流和无空格的情况一致(比如x= 5会被处理成x= + 5),自然不会报错。
  3. 内存注意事项:strdup会分配堆内存,在Yacc中处理完TAB token后记得调用free(yylval.str),避免内存泄漏。

内容的提问来源于stack exchange,提问作者Seb Seb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:30:21