マーク付き文字列解析器の整理 #2
mclexをgetcharのように使う分には簡単に書ける。
mclex_test.c
#include <stdio.h> #include "mclex.h" #include "y.tab.h" int main(void) { int eof = 0; do { int c = mclex(); switch (c) { case EOF: eof = 1; break; case START_MARK: printf("START_MARK\n"); break; case END_MARK: printf("END_MARK\n"); break; case START_ANNOTATION: printf("START_ANNOTATION\n"); break; default: printf("CHARACTER: %c\n", c); break; } } while (! eof); return 0; }
実際のメタ文字が何であってもmclexが返すのは種類を表した定数値であるので、
今までのyylexで行ってきたように返ってきた値を具体的なメタ文字を格納した変数と比較する必要がなくなる。
$ echo -n "ab(cd:ef)gh" | ./mclex_test CHARACTER: a CHARACTER: b START_MARK CHARACTER: c CHARACTER: d START_ANNOTATION CHARACTER: e CHARACTER: f END_MARK CHARACTER: g CHARACTER: h $ echo -n "((<<)><: <a b>c</a>" | ./mclex_test START_MARK CHARACTER: a START_ANNOTATION CHARACTER: b END_MARK CHARACTER: c START_MARK CHARACTER: / CHARACTER: a END_MARK
メタ文字変更シーケンスの解析も機能しているようである。