Bison “弹性投掷”;flex扫描仪中的输入失败”;在解析整个文件之后? 我试图用Flex和BySon在C++中进行解析器。我在网上看到“flex scanner中的输入失败”只出现在为解析提供错误文件的帖子中。但是在我的整个文件正确解析后,我得到了这个错误。是否存在flex无法正确检测EOF的错误?以下是相关定义:

Bison “弹性投掷”;flex扫描仪中的输入失败”;在解析整个文件之后? 我试图用Flex和BySon在C++中进行解析器。我在网上看到“flex scanner中的输入失败”只出现在为解析提供错误文件的帖子中。但是在我的整个文件正确解析后,我得到了这个错误。是否存在flex无法正确检测EOF的错误?以下是相关定义:,bison,flex-lexer,Bison,Flex Lexer,野牛 %union { char node; char gate; int index; } %token END; %token <node> NODE; %token <gate> GATE; %token <index> INDEX; %% atpg: body END { cout << "Reading last line." << endl; }; body: assignmen

野牛

%union {
    char node;
    char gate;
    int index;
}

%token END;
%token <node> NODE;
%token <gate> GATE;
%token <index> INDEX;

%%

atpg:
    body END { cout << "Reading last line." << endl; };
body:
    assignments;
assignments:
    assignments assignment { cout << "Token: assignments - rec." << endl; }
    | assignment         { cout << "Token: assignments - first." << endl; };
assignment:
    outnode gatedec '(' nodelist ')'  {
        cout << "Token: assignment" << endl;
        g_gatelist[last_gate].setOutput(&g_nodelist[out_node]);
        for(int i : t_nodelist)
            g_gatelist[last_gate].addInput(&g_nodelist[i]);
        t_nodelist.clear();
        };
outnode:
    nodedec '='  {
        cout << "Token: outnode" << endl;
        out_node = last_node;
        };
nodedec:
    NODE INDEX  {
        num_nodes ++;
        if ($1 == 'i') input_nodes ++;
        if ($1 == 'o') output_nodes ++;

        new(&g_nodelist[$2]) Node($1, $2);
        last_node = $2;

        cout << g_nodelist[$2] << endl;
        };
gatedec:
    GATE INDEX  {
        num_gates ++;

        createGateFromName(&g_gatelist[$2], $1, $2);
        last_gate = $2;

        cout << "Gate: " << $1 << "-" << $2 << endl; 
        };
nodelist:
    nodedec nodelist { 
        cout << "Token: nodelist - rec" << endl;
        t_nodelist.push_back(last_node);
        }
    | nodedec {
        cout << "Token: nodelist - first" << endl;
        t_nodelist.push_back(last_node);
        };
输入-

n3 = and1 ( i0 i1 i2 )
n4 = or2 ( i1 i2 )
n5 = not3 ( n4 )
n6 = and4 ( n5 n4 )
end
输出-

Node(n-3 = 0)
Token: outnode
Gate: a-1
Node(i-0 = 0)
Node(i-1 = 0)
Node(i-2 = 0)
Token: nodelist - first
Token: nodelist - rec
Token: nodelist - rec
Token: assignment
Token: assignments - first.
Node(n-4 = 0)
Token: outnode
Gate: o-2
Node(i-1 = 0)
Node(i-2 = 0)
Token: nodelist - first
Token: nodelist - rec
Token: assignment
Token: assignments - rec.
Node(n-5 = 0)
Token: outnode
Gate: n-3
Node(n-4 = 0)
Token: nodelist - first
Token: assignment
Token: assignments - rec.
Node(n-6 = 0)
Token: outnode
Gate: a-4
Node(n-5 = 0)
Node(n-4 = 0)
Token: nodelist - first
Token: nodelist - rec
Token: assignment
Token: assignments - rec.
Reading last line.
input in flex scanner failed

Bison总是通过添加一个与您提供的开始规则相匹配的目标规则,然后添加一个文件结束指示符(标记号0),来扩充提供的语法,以便强制输入匹配完整的文件。如果要使用自己的结束标记并在识别到解析后终止解析,则应在关联操作中使用
yyaccpt
操作,以使解析在不读取更多标记的情况下成功终止

当flex扫描器在尝试读取数据时收到读取错误时,就会发生您正在获取的错误。文件结尾不是错误,I/O错误相当少见。通常,此错误表示在报告文件结束并且
yyin
关闭(或设置为无效值)后试图继续读取输入。通常,您应该避免在报告文件结束后读取令牌;虽然它通常可以工作,但并不完全受支持,使用某些扫描仪选项,它将产生意外的结果



作为一个附带问题,您通常会发现使用bison的内置函数比在代码中分散printf更容易。您最终将添加和删除printf,这是一个麻烦,而且它们永远不会像bison跟踪那样为您提供完整的情况。bison总是通过添加一个与您提供的开始规则相匹配的目标规则,然后添加一个文件结束指示符(标记号0),来扩充提供的语法,因此,强制输入匹配完整的文件。如果要使用自己的结束标记并在识别到解析后终止解析,则应在关联操作中使用
yyaccpt
操作,以使解析在不读取更多标记的情况下成功终止

当flex扫描器在尝试读取数据时收到读取错误时,就会发生您正在获取的错误。文件结尾不是错误,I/O错误相当少见。通常,此错误表示在报告文件结束并且
yyin
关闭(或设置为无效值)后试图继续读取输入。通常,您应该避免在报告文件结束后读取令牌;虽然它通常可以工作,但并不完全受支持,使用某些扫描仪选项,它将产生意外的结果



作为一个附带问题,您通常会发现使用bison的内置函数比在代码中分散printf更容易。你最终会添加和删除printf,这是一件麻烦事,它们永远不会像野牛的踪迹那样为你提供一幅完整的画面。

我已经尽了最大努力,但请阅读如何准备一张照片。测试代码是不可能的,因为(1)操作依赖于外部函数,(2)不包括驱动程序和Makefile或构建过程。不要只添加所需函数的定义,因为这会使非最小示例变得更长。相反,准备一个没有(不必要的)操作的版本(在您的情况下,所有操作都是不必要的),并包括使用的所有其他定义(例如yywrap和yyerror,尽管我总是喜欢flex文件中的
%option noyyywrap
),以避免这种需要。)我已经尽了最大努力,但请阅读有关如何准备操作的内容。测试代码是不可能的,因为(1)操作依赖于外部函数,(2)不包括驱动程序和Makefile或构建过程。不要只添加所需函数的定义,因为这会使非最小示例变得更长。相反,准备一个没有(不必要的)操作的版本(在您的情况下,所有操作都是不必要的),并包括使用的所有其他定义(例如,yywrap和yyerror,尽管我总是更喜欢flex文件中的
%option noyyywrap
),以避免需要。)我添加了YYACCEPT,它解决了这个问题。我无法让跟踪工作,添加了
YYDEBUG
--debug
flag@udiboy1209:您只需要
--debug
#定义YYDEBUG
,还需要
YYDEBUG=1。一个常见的习惯用法是,如果YYDEBUG
YYDEBUG=1,则放入
#
#endif
转换为
main
(如果解析器包含的内容在main中可见)。可能这一段应该更靠近文档页面的顶部。“一旦您使用跟踪工具编译了程序,请求跟踪的方法就是在变量yydebug中存储一个非零值。”人们似乎经常忽略它。如果真是这样的话,程序员将实际阅读一整页文档的假设似乎已经成为过去。我添加了YYACCEPT,它解决了这个问题。我无法让跟踪工作,添加了
YYDEBUG
--debug
flag@udiboy1209:您只需要
--debug
#定义YYDEBUG
,还需要
YYDEBUG=1。一个常见的习惯用法是,如果YYDEBUG
YYDEBUG=1,则放入
#
#endif
转换为
main
(如果解析器包含的内容在main中可见)。可能这一段应该更靠近文档页面的顶部。“一旦您使用跟踪工具编译了程序,请求跟踪的方法就是在变量yydebug中存储一个非零值。”人们似乎经常忽略它。如果真是这样的话,程序员将实际阅读一整页文档的假设似乎已经成为过去。
Node(n-3 = 0)
Token: outnode
Gate: a-1
Node(i-0 = 0)
Node(i-1 = 0)
Node(i-2 = 0)
Token: nodelist - first
Token: nodelist - rec
Token: nodelist - rec
Token: assignment
Token: assignments - first.
Node(n-4 = 0)
Token: outnode
Gate: o-2
Node(i-1 = 0)
Node(i-2 = 0)
Token: nodelist - first
Token: nodelist - rec
Token: assignment
Token: assignments - rec.
Node(n-5 = 0)
Token: outnode
Gate: n-3
Node(n-4 = 0)
Token: nodelist - first
Token: assignment
Token: assignments - rec.
Node(n-6 = 0)
Token: outnode
Gate: a-4
Node(n-5 = 0)
Node(n-4 = 0)
Token: nodelist - first
Token: nodelist - rec
Token: assignment
Token: assignments - rec.
Reading last line.
input in flex scanner failed