提取行内容失败flex/bison
问题描述:
我尝试提取一行的内容并在该行中的输入被从野牛中拒绝时打印它们。 我尝试重现这些建议:http://archive.oreilly.com/pub/a/linux/excerpts/9780596155971/error-reporting-recovery.html但是当输入被拒绝时,将打印下一行而不是被拒绝的行,而行的编号已正确打印。提取行内容失败flex/bison
挠曲:
%{
#include <stdio.h>
#include "parser.tab.h"
int line_number = 0;
char linebuf[500];
%}
...
%%
\n.* { ++line_number; strncpy(linebuf, yytext+1, sizeof(linebuf)); /* save the next line */
yyless(1); /* give back all but the \n to rescan */
}
%%
野牛:
%{
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include "parser.tab.h"
extern int yylex(void);
extern int line_number;
extern char line_contents[500];
void yyerror(char const *s);
%}
...
%%
int main(){
if(yyparse() == 0)
printf("Accepted\n");
else
printf("Syntax error in line %d: %s\n" line_number, linebuf);
...
对从野牛拒绝上述从包含语法错误的一个printd下一行的办法输入。
input:
result = function //(semicolon expected)
else
输出:
Syntax error in line 1: else
相信词法规则\n.*
或yytext+1
驱动器输出到下一行,但其词法规则是正确的?
答
发生这种情况是因为野牛使用1-token向前解析。所以直到扫描器读取并返回ELSE标记之后才会注意到(或诊断)缺失的分号。在这一点上,前面的规则(期待分号或其他东西来表达一个更长的表达式)不能匹配(在该状态下对标记ELSE没有移位或减少动作)。
一旦发现错误,解析器会调用打印该消息的yyerror(以及最近读取的行,即带有ELSE标记的那一行)。