“auto”{count();回报(AUTO); }
“break”{count();返回(BREAK); }
“case”{count();返回(CASE); }
“char”{count();返回(CHAR); }
count()在lex中的作用是什么?
另外,语句“column + = 8 - (column%8);”在以下功能中不明确
void count()
{
int i;
for (i = 0; yytext[i] != '\0'; i++)
if (yytext[i] == '\n')
column = 0;
else if (yytext[i] == '\t')
column += 8 - (column % 8);
else
column++;
ECHO;
}
答案 0 :(得分:1)
这只是某人写的功能;它与flex无关。它可能不是如何编写词法分析器的好模型,所以我建议不要将它作为指南。
该功能正在尝试维护当前列位置,并考虑制表位。因此,当它碰到一个标签时,它会将列号移动到下一个标签停止位置,假设它们是每八个字符。
显然,在这些模式的情况下,复杂性是没有意义的,因为它们不能包含换行符或制表符。 column += yyleng;
就足以满足这种模式。我想无论谁写的都不是在担心优化,这是公平的。
答案 1 :(得分:0)
OP澄清了这个问题,指出了这个说法:
column += 8 - (column % 8);
OP假定与
相同column += 8;
这是一个经常用于制表符扩展的表单,例如,在第0,8,16,24列设置制表位(如果从零开始计算,并且制表符间隔为8)。从(column % 8)
中减去8
并将 列添加到列的点是差异是到下一个制表位的距离。所以,
[0 .. 7]
范围内,则会映射到8
,[8 .. 15]
范围内,则会映射到16
,在每个点,列是左边距的偏移量(换行符所在的位置)。函数count()
假定没有其他非打印字符而不是\n
(换行符)和\t
(制表符)。