« const_castを実装中のプログラムの中に見た | トップページ | お気軽にXMLを扱ってみる 其の7 »

2010年10月22日 (金)

お気軽にXMLを扱ってみる 其の6

では、字句解析を設計します。

区切り記号は、以下のワードにします。

『<』,『/』,『"』,『>』,『=』,『 』,『\r』,『\n』,『\t』

上記区切りの中でも、コントロールコードの『\r』,『\n』,『\t』につきましては、参照等を行わないので、構文解析を簡単にするためにも、無視してしまいます。

たとえば、以下の文章に適用すると、

<fruit>
  <apple price="100" />
  <glape price="200" />
</fruit>

以下のような字句に分解できます。

『<』『fruit』『>』『<』『apple』『 』『price』『=』『"』『100』・・・

XMLの文章をいきなり解析しようとすると、どうやってやろうかって感じですが、字句に分解されていれば、なんとか解析できそうですね。

それでは、コード化しましょう。

文章を渡すと、分解された語句の集まりが取得できるような関数になればいいので、以下のような関数を設計します。

void collectTokens( const char* _xml, list<string>& TokenList )

区切りを見つけるたびに、_xmlの文字を一文字ずつ取得して、その文字が区切りでないならば、語句として合成していきます。区切り文字がきたときには、その時点でできあがっている語句をリストに積んで、また、語句の合成を行っていきます。

以上の事をコードにすると、以下のような感じになりました。

void collectTokens( const char* _xml, list<string>& TokenList ) {
    string str;
    for( ;; ) {
        // 文章から一文字取得
        char c = *_xml++;
        if( c == NULL ) {
            // 走査完了
            if( !str.empty() ) {
                // 未処理ワードが残っているならば、リストに積む
                TokenList.push_back( str );
            }
            break;
        }
        else if( ( c == '<' ) || ( c == '/' ) || ( c == '"' ) ||
            ( c == '>' ) ||   ( c == '=' ) || ( c == ' ' ) ||
            ( c == '\n' ) || ( c == '\r' ) || ( c == '\t' ) )
        {
            if( !str.empty() ) {
                TokenList.push_back( str );
                str.clear();
            }
            if( ( c != '\n' ) && ( c != '\r' ) && ( c != '\t' ) )
            {
                // 上記の無視ワード以外
                str = c;
                TokenList.push_back( str );
                str.clear();
            }
        }
        else  {
            str += c;
        }
    }
}

つぎは、構文解析を考えていきます。

|

« const_castを実装中のプログラムの中に見た | トップページ | お気軽にXMLを扱ってみる 其の7 »

C++」カテゴリの記事

XML」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: お気軽にXMLを扱ってみる 其の6:

« const_castを実装中のプログラムの中に見た | トップページ | お気軽にXMLを扱ってみる 其の7 »