マーク付けに使う文字の変更 #3
複数の種類のメタ文字を同じ文字に指定すると、
int yylex(void) ...snip if (c == start_mark_char) return START_MARK; if (c == end_mark_char) return END_MARK; if (c == start_annotation_char) { ...snip return START_ANNOTATION; }
なので、START_MARK > END_MARK > START_ANNOTATION
の順で、返される終端記号の種類が優先される。
そんな変な指定をすること自体がエラー的なので、そのような指定があればエラーを返すようにすべきだろう。
int main(int argc, char *argv[]) ...snip while ((opt = getopt(argc, argv, "s:e:a:")) != -1) { ...snip } if (start_mark_char == end_mark_char || end_mark_char == start_annotation_char || start_annotation_char == start_mark_char) { fprintf(stderr, "error: meta characters must differ from each other\n"); exit(1); } return yyparse(); ...snip
$ echo -n "abcabc" | ./parser -sa -ea error: meta characters must differ from each other $ echo -n "abcabc" | ./parser -sa -ec marked-string [b] marked-string [b]