Lex 和 YACC(FLEX 和 Bison)

Lex and YACC (FLEX and Bison)

您好,我需要了解 flex 和 bison 才能重写为 QRegExp,出现以下问题。 如果代币同时适用于多个团队,那么YACC/BISON将如何行动? 例如,有一个 FLOAT_NUM 标记, 有两个命令:

据此,下面的表达式得出YACC/Bison:

STARTED FLOAT_NUM

我的理解是否正确,只有 'title' 命令有效,而 'my_type' 命令仅在一个 FLOAT_NUM 到达时有效?

Yacc 生成一个state machine,每次取一个令牌,并根据当前状态和令牌决定下一个状态。

例如,在您的情况下,如果它获得令牌 STARTED,它可能会进入一种状态,可以描述为“我在终端 title 的位置 1,我现在希望令牌 FLOAT_NUM”。 要回答如果令牌 X 到达会发生什么的问题,您始终需要首先知道解析器当前处于哪种状态。

很难处理一个不完整的示例,所以我假设您的完整程序如下所示:

%token STARTED FLOAT_NUM

%start main

%%

main: title | my_type {}
title: STARTED FLOAT_NUM {}
my_type: FLOAT_NUM {}

解析从起始终端的开头开始(在本例中为main),并在到达起始终端的结尾时结束。

因此,在这种情况下,起始终端可以由 titlemy_type 组成,因此解析器期望第一个标记是 STARTEDFLOAT_NUM . 当它得到它们中的任何一个时,解析器可以明确地知道它当前是在 title 还是 my_type 中。如果示例不同并且它们以相同的标记开始,则解析器将进入“titlemy_type 状态,现在给我第二个标记”,然后解析将继续。

您可以通过 运行 bison 和选项 -r all 查看所有生成的状态是什么以及它们如何相互变化,它创建了一个人类可读的文件生成的状态机的完整报告。

这是完整的基础知识。希望对您有所帮助。

如果这还不够,我建议阅读 bison manual, especially the section describing the state machine