我正在挖掘一个用 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 的良好解释的引用。谢谢!
(将评论整理为答案,只是为了做一个问答对).
这些是描述“(有限)自动机”或“有限状态机”的数据,用于实现词法分析器生成输入/配置文件描述的文本分析。
阅读“有限自动机”,例如:http://www.cs.man.ac.uk/~pjj/cs211/ho/node6.html
一般来说,它们描述了有限状态机的行为,生成的词法分析器函数将使用该有限状态机来处理输入。通过使用 -v / --verbose 选项运行 Flex 并将结果与表进行比较,您可能会得到一些线索。
表的确切含义因表压缩类型而异(请参阅选项 -C)。
我(John Bollinger,但可能大多数人都同意)怀疑是否有人能够在不研究(或已经知道)Flex 源代码的情况下具体告诉您这些表的含义。它或多或少是生成词法分析器的核心思想,以保护用户不需要了解这些细节。