teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

バグ修正

2020/03/10 15:52

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -63,8 +63,30 @@
63
63
 
64
64
  int main(void)
65
65
  {
66
- if (parse(EOF) !== EOF) error("unexpected closing paren");
66
+ if (parse(EOF) != EOF) error("unexpected closing paren");
67
67
  puts("OK");
68
68
  }
69
69
  ```
70
- バグのご指摘お待ちしています。
70
+ バグのご指摘お待ちしています。
71
+
72
+ **追記2**
73
+ 最後のところにバグがありました。次のように訂正します。
74
+ ```C
75
+ else if ((p = strchr(pa, c))) { // parse parentheses
76
+ int r = ren[p - pa];
77
+ if (parse(r) != r) error("paren not closed");
78
+ }
79
+ else if (strchr(ren, c)) {
80
+ if (c == e) break;
81
+ error("unexpected closing paren");
82
+ }
83
+ }
84
+ return c;
85
+ }
86
+
87
+ int main(void)
88
+ {
89
+ parse(EOF);
90
+ puts("OK");
91
+ }
92
+ ```

3

コードの修正

2020/03/10 15:52

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -63,7 +63,8 @@
63
63
 
64
64
  int main(void)
65
65
  {
66
- puts(parse(EOF) == EOF ? "OK" : "unexpected closing paren");
66
+ if (parse(EOF) !== EOF) error("unexpected closing paren");
67
+ puts("OK");
67
68
  }
68
69
  ```
69
70
  バグのご指摘お待ちしています。

2

コードの修正

2020/03/10 11:40

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  また、コメントには // から \n まで以外に、/* から */ までというのもあります。
9
9
 
10
+ **追記**
10
11
  コードを追記しようとしたら、間違って新規の回答にしてしまい、それが削除できません。
11
12
  改めてここに追記します。
12
13
  ```C
@@ -53,7 +54,7 @@
53
54
  }
54
55
  else if ((p = strchr(pa, c))) { // parse parentheses
55
56
  int r = ren[p - pa];
56
- if (parse(b) != r) error("paren not closed");
57
+ if (parse(r) != r) error("paren not closed");
57
58
  }
58
59
  else if (strchr(ren, c)) break;
59
60
  }

1

コードの追加

2020/03/10 11:37

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -5,4 +5,64 @@
5
5
  さらに、括弧の釣り合いを括弧の個数だけでは判断できません。
6
6
  例えば、abc)def(ghi や ab(cd[ef)gh]ij はエラーにしないといけないでしょう。
7
7
 
8
- また、コメントには // から \n まで以外に、/* から */ までというのもあります。
8
+ また、コメントには // から \n まで以外に、/* から */ までというのもあります。
9
+
10
+ コードを追記しようとしたら、間違って新規の回答にしてしまい、それが削除できません。
11
+ 改めてここに追記します。
12
+ ```C
13
+ #include <stdio.h> // getchar, printf, puts
14
+ #include <stdlib.h> // exit
15
+ #include <string.h> // strchr
16
+
17
+ void error(const char *s) { printf("Error: %s\n", s); exit(1); }
18
+
19
+ void error2(int d)
20
+ {
21
+ error(d == '"' ? "string literal not closed" :"character constant not closed");
22
+ }
23
+
24
+ int parse(int e)
25
+ {
26
+ static char pa[] = "([{", ren[] = ")]}";
27
+ int c;
28
+ char *p;
29
+
30
+ while ((c = getchar()) != EOF) {
31
+ if (c == '/') {
32
+ if ((c = getchar()) == EOF) return c;
33
+ if (c == '/') // skip "// comment"
34
+ while ((c = getchar()) != EOF && c != '\n') ;
35
+ else if (c == '*') // skip "/* */ comment"
36
+ do {
37
+ while ((c = getchar()) != EOF && c != '*') ;
38
+ if (c == EOF || (c = getchar()) == EOF)
39
+ error("comment not closed");
40
+ } while (c != '/');
41
+ }
42
+ else if (c == '"' || c == '\'') {
43
+ int d = c, k = 0; // skip string literal or charcter constant
44
+ do {
45
+ if ((c = getchar()) == EOF || c == '\n') error2(d);
46
+ if (c == '\') {
47
+ if ((c = getchar()) == EOF) error2(d);
48
+ if (c == d) c = 0;
49
+ }
50
+ k++;
51
+ } while (c != d);
52
+ if (d == '\'' && (k < 2 || k > 5)) error("bad character constant");
53
+ }
54
+ else if ((p = strchr(pa, c))) { // parse parentheses
55
+ int r = ren[p - pa];
56
+ if (parse(b) != r) error("paren not closed");
57
+ }
58
+ else if (strchr(ren, c)) break;
59
+ }
60
+ return c;
61
+ }
62
+
63
+ int main(void)
64
+ {
65
+ puts(parse(EOF) == EOF ? "OK" : "unexpected closing paren");
66
+ }
67
+ ```
68
+ バグのご指摘お待ちしています。