一、 实验内容

  1. 实现错误检测,并使程序继续运行

二、 实验过程

  1. 运行未实现功能的代码,可以看见错误点没有返回信息
  2. 编写syntax.y文件,进行error处理

syntax.y

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

%{
#include"lex.yy.c"
int i=0;
void yyerror();
%}

%token LC RC LB RB COLON COMMA
%token STRING NUMBER
%token TRUE FALSE VNULL
%%

Json:
Value
| LB Values RB COMMA error { puts("Comma after the close, recovered"); }
| LB Values RB RB error { puts("Extra close, recovered"); }
| LC Members RC Values error { puts("Extra value after close, recovered"); }
;
Value:
Object
| Array
| STRING
| NUMBER {if($1==0) {yyerror();i++;puts("Numbers cannot have leading zeroes, recovered");}}
| TRUE
| FALSE
| VNULL
;
Object:
LC RC
| LC Members RC
;
Members:
Member
| Member COMMA RC error { puts("Extra comma, recovered"); }
| Member COMMA Members
;
Member:
STRING COLON Value
| STRING Value error { puts("Missing colon, recovered"); }
| STRING COLON COLON Value error { puts("Double colon, recovered"); }
| STRING COMMA Values error { puts("Comma instead of colon, recovered"); }
| error { if(i==0){puts("Comma instead if closing brace, recovered");i++; }}
;
Array:
LB RB
| LB Values RB
| LB Values error { puts("Unclosed array, recovered"); }
| LB Values RC error { puts("mismatch, recovered"); }
| COMMA Values error { puts("<-- missing value, recovered"); }
;
Values:
Value
| Value COMMA Values
| Value COLON Values error{ puts("Colon instead of comma, recovered"); }
| COMMA error { puts("double extra comma, recovered"); }
| Value COMMA error { puts("extra comma, recovered"); }
;
%%

void yyerror(){
if(i==0)
printf("syntax error: ");
}

int main(int argc, char **argv){
if(argc != 2) {
fprintf(stderr, "Usage: %s <file_path>\n", argv[0]);
exit(-1);
}
else if(!(yyin = fopen(argv[1], "r"))) {
perror(argv[1]);
exit(-1);
}
yyparse();
return 0;
}

  1. 运行指令,实现成功

没有程序运行的warning警告,说明没有s/r或者r/r冲突
img
运行结果如下
img

三、 代码解释

Json中部分差错处理:

LB Values RB COMMA error { puts(“Comma after the close, recovered”); }

在大括号后匹配到“,”进入这一语句

LB Values RB RB error { puts(“Extra close, recovered”); }

如果匹配到两个大括号发生这一错误

LC Members RC Values error { puts(“Extra value after close, recovered”); }

在大括号后匹配到其他value值,进入这一语句

Value中部分差错处理:

NUMBER {if($1==0) {yyerror();i++;puts(“Numbers cannot have leading zeroes, recovered”);}}

NUMBER为零表面无法直接进行错误处理,因此读入时进行判断,如果为零在执行错误处理操作

Members中部分差错处理:

Member COMMA RC error { puts(“Extra comma, recovered”); }

对于数据中的额外逗号进行处理

Member中部分差错处理:

STRING Value error { puts(“Missing colon, recovered”); }

对分号丢失进行匹配处理

STRING COLON COLON Value error { puts(“Double colon, recovered”); }

对双分号进行匹配处理

STRING COMMA Values error { puts(“Comma instead of colon, recovered”); }

如果‘,’代替了‘;’进行匹配处理

error { if(i==0){puts(“Comma instead if closing brace, recovered”);i++; }}

这里处理的是‘,’替代了结束符,由于这一语句不好表现,其他错误处理又能完全进行匹配,所以这里直接用error进行匹配

Array:

LB Values error { puts(“Unclosed array, recovered”); }

进行array丢失处理

LB Values RC error { puts(“mismatch, recovered”); }

返回错误处理

COMMA Values error { puts(“<– missing value, recovered”); }

如果两逗号之间无数值说明丢失数值,但为和双逗号进行区分,找到区别之处在于,数值丢失后,后一逗号之后还有value值

Values:

Value COLON Values error{ puts(“Colon instead of comma, recovered”); }

同上,符号写错

COMMA error { puts(“double extra comma, recovered”); }

如语句后又单独匹配到‘,’说明有双逗号

Value COMMA error { puts(“extra comma, recovered”); }

值后又有逗号,说明出现额外逗号

四、 遇到困难和解决办法

  1. 在编写过程中经常出现warning冲突警告,需要合理调整语句所在位置才能消除。