在 lex.yy.c 中查找表代表什么?

问题描述 投票:0回答:1

我正在挖掘一个用 flex 构建的词法分析器(准确地说是这里),并试图了解正在发生的事情。从来没有看过 C,我已经放弃尝试寻找与 理解用 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 的良好解释的引用。谢谢!

c flex-lexer lex
1个回答
3
投票

(将评论整理为答案,只是为了做一个问答对).

这些是描述“(有限)自动机”或“有限状态机”的数据,用于实现词法分析器生成输入/配置文件描述的文本分析。

阅读“有限自动机”,例如:http://www.cs.man.ac.uk/~pjj/cs211/ho/node6.html

一般来说,它们描述了有限状态机的行为,生成的词法分析器函数将使用该有限状态机来处理输入。通过使用 -v / --verbose 选项运行 Flex 并将结果与表进行比较,您可能会得到一些线索。

表的确切含义因表压缩类型而异(请参阅选项 -C)。

我(John Bollinger,但可能大多数人都同意)怀疑是否有人能够在不研究(或已经知道)Flex 源代码的情况下具体告诉您这些表的含义。它或多或少是生成词法分析器的核心思想,以保护用户不需要了解这些细节。

© www.soinside.com 2019 - 2024. All rights reserved.