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中的查找表包含什么开始:
当然,也欢迎提及对生成的lex.yy.c的良好解释。谢谢!
想改进这个问题吗?更新问题,使其只关注一个问题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