マーク付き文字列解析器の整理 #3
mclexを使うように今までのyylexを書き直すための原型を書いてみた。
といってもyylexの骨格はそのままで、
文字の取得をmclexによるトークンの取得に置き換えただけである。
mclex_test2.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 [%c]\n", mclval); break; default: printf("NORMAL_STRING ["); for (;;) { printf("%c", c); c = mclex(); switch (c) { case EOF: case START_MARK: case END_MARK: case START_ANNOTATION: mcunput(c); printf("]\n"); goto eos; } } eos: break; } } while (! eof); return 0; }
$ echo -n "ab(cd:ef)gh" | ./mclex_test2 NORMAL_STRING [ab] START_MARK NORMAL_STRING [cd] START_ANNOTATION [:] NORMAL_STRING [ef] END_MARK NORMAL_STRING [gh] $ echo -n "((<<)><: <a b>c</a>" | ./mclex_test2 START_MARK NORMAL_STRING [a] START_ANNOTATION [ ] NORMAL_STRING [b] END_MARK NORMAL_STRING [c] START_MARK NORMAL_STRING [/a] END_MARK
NORMAL_STRINGは構文解析器でのトークン識別子でいえばSTRING_EXCEPT_SPECIALに相当する。