解析整个文件后,Flex 抛出 "input in flex scanner failed"?
Flex throws "input in flex scanner failed" after parsing whole file?
我正在尝试使用 Flex 和 Bison 在 C++ 中创建一个解析器。我只在网上看到 "input in flex scanner failed" 的帖子提供了错误的解析文件。但是在我的整个文件被正确解析后我收到了这个错误。是否存在 flex 无法正确检测 EOF 的错误?这些是相关定义:
野牛 -
%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 ( == 'i') input_nodes ++;
if ( == 'o') output_nodes ++;
new(&g_nodelist[]) Node(, );
last_node = ;
cout << g_nodelist[] << endl;
};
gatedec:
GATE INDEX {
num_gates ++;
createGateFromName(&g_gatelist[], , );
last_gate = ;
cout << "Gate: " << << "-" << << 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);
};
弹性 -
%{
#include "gatelist.tab.h"
#define YY_DECL extern "C" int yylex()
%}
INDEX [0-9]+
GATE and|or|not
NODE n|i|o
%%
{GATE} { yylval.gate = yytext[0]; return GATE; }
{NODE} { yylval.node = yytext[0]; return NODE; }
{INDEX} { yylval.index = atoi(yytext); return INDEX; }
[\(\)=] { return yytext[0]; }
end { return END; }
.|\n ;/* ignore */
%%
;
输入-
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 总是通过添加一个与您提供的开始规则相匹配的目标规则,然后是一个 end-of-file 指示符(标记号 0)来增强提供的语法,以便输入被强制匹配一个完整的文件。如果你想使用你自己的结束标记并在它被识别时终止解析,你应该在关联的操作中使用 YYACCEPT
操作来使解析成功终止而不读取更多标记。
当 flex 扫描仪在尝试读取数据时收到读取错误时,就会出现您遇到的错误。文件结尾 不是 错误,I/O 错误并不常见。通常,此错误表示在报告文件结束并且 yyin
关闭(或设置为无效值)后尝试继续读取输入。一般来说,你应该避免在 end-of-file 被报告后读取标记;尽管它经常有效,但并未得到完全支持,并且对于某些扫描仪选项,它会产生意想不到的结果。
作为附带问题,您通常会发现使用 bison 的 built-in trace facility 比在整个代码中散布 printf 更容易。您最终将添加和删除 printf,这很麻烦,而且它们永远不会为您提供完整的图像,如野牛跟踪一样。
我正在尝试使用 Flex 和 Bison 在 C++ 中创建一个解析器。我只在网上看到 "input in flex scanner failed" 的帖子提供了错误的解析文件。但是在我的整个文件被正确解析后我收到了这个错误。是否存在 flex 无法正确检测 EOF 的错误?这些是相关定义:
野牛 -
%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 ( == 'i') input_nodes ++;
if ( == 'o') output_nodes ++;
new(&g_nodelist[]) Node(, );
last_node = ;
cout << g_nodelist[] << endl;
};
gatedec:
GATE INDEX {
num_gates ++;
createGateFromName(&g_gatelist[], , );
last_gate = ;
cout << "Gate: " << << "-" << << 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);
};
弹性 -
%{
#include "gatelist.tab.h"
#define YY_DECL extern "C" int yylex()
%}
INDEX [0-9]+
GATE and|or|not
NODE n|i|o
%%
{GATE} { yylval.gate = yytext[0]; return GATE; }
{NODE} { yylval.node = yytext[0]; return NODE; }
{INDEX} { yylval.index = atoi(yytext); return INDEX; }
[\(\)=] { return yytext[0]; }
end { return END; }
.|\n ;/* ignore */
%%
;
输入-
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 总是通过添加一个与您提供的开始规则相匹配的目标规则,然后是一个 end-of-file 指示符(标记号 0)来增强提供的语法,以便输入被强制匹配一个完整的文件。如果你想使用你自己的结束标记并在它被识别时终止解析,你应该在关联的操作中使用 YYACCEPT
操作来使解析成功终止而不读取更多标记。
当 flex 扫描仪在尝试读取数据时收到读取错误时,就会出现您遇到的错误。文件结尾 不是 错误,I/O 错误并不常见。通常,此错误表示在报告文件结束并且 yyin
关闭(或设置为无效值)后尝试继续读取输入。一般来说,你应该避免在 end-of-file 被报告后读取标记;尽管它经常有效,但并未得到完全支持,并且对于某些扫描仪选项,它会产生意想不到的结果。
作为附带问题,您通常会发现使用 bison 的 built-in trace facility 比在整个代码中散布 printf 更容易。您最终将添加和删除 printf,这很麻烦,而且它们永远不会为您提供完整的图像,如野牛跟踪一样。