Closed. This question needs to be more focused. It is not currently accepting answers. Learn more
想改进这个问题吗?更新问题,使其只关注一个问题editing this post
两年前关闭。
我正在钻研一个用flex构建的lexer(here准确地说)并试图了解正在发生的事情。从来没有看过C,我已经放弃了寻找等价于understand parsers made with Bison,所以我希望在这里获得一些基本信息,从lex.yy.C中的查找表包含什么开始:
static yyconst short int yy_accept[33] =
{   0,
    0,    0,   15,   13,   12,   10,    7,   13,   13,    8,
    2,    9,   13,    3,    4,    0,   11,    0,    0,    2,
    1,    0,    0,    0,    0,    0,    0,    0,    0,    5,
    6,    0
} ;

static yyconst int yy_ec[256] =
{   0,
    1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    2,    4,    1,    5,    1,    6,    1,    1,    1,
    1,    7,    1,    1,    1,    1,    1,    8,    8,    8,
    8,    8,    8,    8,    8,    8,    8,    9,    1,    1,
    1,    1,    1,   10,   11,    8,    8,    8,   12,    8,
   13,    8,   14,    8,    8,    8,    8,   15,   16,    8,
    8,   17,   18,    8,    8,    8,    8,    8,    8,    8,
    1,    1,    1,    1,    8,    1,    8,    8,    8,    8,

    8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
    8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
    8,    8,   19,    1,   20,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1
} ;

static yyconst int yy_meta[21] =
{   0,
    1,    1,    1,    1,    1,    1,    1,    2,    1,    1,
    2,    2,    2,    2,    2,    2,    2,    2,    1,    1
} ;

static yyconst short int yy_base[36] =
{   0,
    0,    0,   39,   40,   40,   40,   40,   35,   10,   40,
    0,   40,    0,   40,   40,   34,   40,   18,   22,    0,
    0,   16,   18,   18,   15,   17,   12,   13,   15,   40,
   40,   40,   24,   21,   20
} ;

static yyconst short int yy_def[36] =
{   0,
   32,    1,   32,   32,   32,   32,   32,   33,   32,   32,
   34,   32,   35,   32,   32,   33,   32,   32,   32,   34,
   35,   32,   32,   32,   32,   32,   32,   32,   32,   32,
   32,    0,   32,   32,   32
} ;

static yyconst short int yy_nxt[61] =
{   0,
    4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
   11,   11,   11,   11,   11,   11,   11,   11,   14,   15,
   18,   21,   20,   19,   16,   16,   31,   30,   29,   28,
   27,   26,   25,   24,   23,   22,   17,   17,   32,    3,
   32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
   32,   32,   32,   32,   32,   32,   32,   32,   32,   32
} ;

static yyconst short int yy_chk[61] =
{   0,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
    9,   35,   34,    9,   33,   33,   29,   28,   27,   26,
   25,   24,   23,   22,   19,   18,   16,    8,    3,   32,
   32,   32,   32,   32,   32,   32,   32,   32,   32,   32,
   32,   32,   32,   32,   32,   32,   32,   32,   32,   32
} ;

当然,也欢迎提及对生成的lex.yy.c的良好解释。谢谢!

最佳答案

(将评论汇编成一个答案,仅用于形成一对问答)。
这些是用来描述“(有限)自动机”或“有限状态机”的数据,用于实现lexer生成输入/配置文件所描述的文本分析。
阅读“有限自动机”,例如:http://www.cs.man.ac.uk/~pjj/cs211/ho/node6.html
它们通常描述有限状态机的行为,生成的lexer函数将用它处理输入。您可以通过使用-v/--verbose选项运行Flex并将结果与表进行比较来获得一些线索。
表的确切含义取决于表压缩类型(请参见选项-C)。
我(John Bollinger,但可能大多数人都同意)怀疑,没有研究(或已经知道)Flex源代码,任何人都不能确切地告诉您这些表的含义。它或多或少是生成的lexer的核心思想,以保护用户不必知道这些细节。

关于c - 在lex.yy.c中,查找表代表什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43286687/

10-12 16:15