回答編集履歴

4

バグ修正

2020/03/10 15:52

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -128,7 +128,7 @@
128
128
 
129
129
  {
130
130
 
131
- if (parse(EOF) !== EOF) error("unexpected closing paren");
131
+ if (parse(EOF) != EOF) error("unexpected closing paren");
132
132
 
133
133
  puts("OK");
134
134
 
@@ -137,3 +137,47 @@
137
137
  ```
138
138
 
139
139
  バグのご指摘お待ちしています。
140
+
141
+
142
+
143
+ **追記2**
144
+
145
+ 最後のところにバグがありました。次のように訂正します。
146
+
147
+ ```C
148
+
149
+ else if ((p = strchr(pa, c))) { // parse parentheses
150
+
151
+ int r = ren[p - pa];
152
+
153
+ if (parse(r) != r) error("paren not closed");
154
+
155
+ }
156
+
157
+ else if (strchr(ren, c)) {
158
+
159
+ if (c == e) break;
160
+
161
+ error("unexpected closing paren");
162
+
163
+ }
164
+
165
+ }
166
+
167
+ return c;
168
+
169
+ }
170
+
171
+
172
+
173
+ int main(void)
174
+
175
+ {
176
+
177
+ parse(EOF);
178
+
179
+ puts("OK");
180
+
181
+ }
182
+
183
+ ```

3

コードの修正

2020/03/10 15:52

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -128,7 +128,9 @@
128
128
 
129
129
  {
130
130
 
131
- puts(parse(EOF) == EOF ? "OK" : "unexpected closing paren");
131
+ if (parse(EOF) !== EOF) error("unexpected closing paren");
132
+
133
+ puts("OK");
132
134
 
133
135
  }
134
136
 

2

コードの修正

2020/03/10 11:40

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -15,6 +15,8 @@
15
15
  また、コメントには // から \n まで以外に、/* から */ までというのもあります。
16
16
 
17
17
 
18
+
19
+ **追記**
18
20
 
19
21
  コードを追記しようとしたら、間違って新規の回答にしてしまい、それが削除できません。
20
22
 
@@ -108,7 +110,7 @@
108
110
 
109
111
  int r = ren[p - pa];
110
112
 
111
- if (parse(b) != r) error("paren not closed");
113
+ if (parse(r) != r) error("paren not closed");
112
114
 
113
115
  }
114
116
 

1

コードの追加

2020/03/10 11:37

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -13,3 +13,123 @@
13
13
 
14
14
 
15
15
  また、コメントには // から \n まで以外に、/* から */ までというのもあります。
16
+
17
+
18
+
19
+ コードを追記しようとしたら、間違って新規の回答にしてしまい、それが削除できません。
20
+
21
+ 改めてここに追記します。
22
+
23
+ ```C
24
+
25
+ #include <stdio.h> // getchar, printf, puts
26
+
27
+ #include <stdlib.h> // exit
28
+
29
+ #include <string.h> // strchr
30
+
31
+
32
+
33
+ void error(const char *s) { printf("Error: %s\n", s); exit(1); }
34
+
35
+
36
+
37
+ void error2(int d)
38
+
39
+ {
40
+
41
+ error(d == '"' ? "string literal not closed" :"character constant not closed");
42
+
43
+ }
44
+
45
+
46
+
47
+ int parse(int e)
48
+
49
+ {
50
+
51
+ static char pa[] = "([{", ren[] = ")]}";
52
+
53
+ int c;
54
+
55
+ char *p;
56
+
57
+
58
+
59
+ while ((c = getchar()) != EOF) {
60
+
61
+ if (c == '/') {
62
+
63
+ if ((c = getchar()) == EOF) return c;
64
+
65
+ if (c == '/') // skip "// comment"
66
+
67
+ while ((c = getchar()) != EOF && c != '\n') ;
68
+
69
+ else if (c == '*') // skip "/* */ comment"
70
+
71
+ do {
72
+
73
+ while ((c = getchar()) != EOF && c != '*') ;
74
+
75
+ if (c == EOF || (c = getchar()) == EOF)
76
+
77
+ error("comment not closed");
78
+
79
+ } while (c != '/');
80
+
81
+ }
82
+
83
+ else if (c == '"' || c == '\'') {
84
+
85
+ int d = c, k = 0; // skip string literal or charcter constant
86
+
87
+ do {
88
+
89
+ if ((c = getchar()) == EOF || c == '\n') error2(d);
90
+
91
+ if (c == '\') {
92
+
93
+ if ((c = getchar()) == EOF) error2(d);
94
+
95
+ if (c == d) c = 0;
96
+
97
+ }
98
+
99
+ k++;
100
+
101
+ } while (c != d);
102
+
103
+ if (d == '\'' && (k < 2 || k > 5)) error("bad character constant");
104
+
105
+ }
106
+
107
+ else if ((p = strchr(pa, c))) { // parse parentheses
108
+
109
+ int r = ren[p - pa];
110
+
111
+ if (parse(b) != r) error("paren not closed");
112
+
113
+ }
114
+
115
+ else if (strchr(ren, c)) break;
116
+
117
+ }
118
+
119
+ return c;
120
+
121
+ }
122
+
123
+
124
+
125
+ int main(void)
126
+
127
+ {
128
+
129
+ puts(parse(EOF) == EOF ? "OK" : "unexpected closing paren");
130
+
131
+ }
132
+
133
+ ```
134
+
135
+ バグのご指摘お待ちしています。