一、 实验内容
- 实现错误检测,并使程序继续运行
二、 实验过程
- 运行未实现功能的代码,可以看见错误点没有返回信息
- 编写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; }
|
- 运行指令,实现成功
没有程序运行的warning警告,说明没有s/r或者r/r冲突

运行结果如下

三、 代码解释
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”); }
值后又有逗号,说明出现额外逗号
四、 遇到困难和解决办法
- 在编写过程中经常出现warning冲突警告,需要合理调整语句所在位置才能消除。