计算功能用法

时间:2016-01-23 08:04:05

标签: c flex-lexer lex

“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;
}

2 个答案:

答案 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(制表符)。