• ベストアンサー

題名:分割した単語を元の文章に戻したい

英文を単語ごとに分けるプログラム, (#include <stdio.h>を  (#) (include) (<) (stdio) (.) (>) にすることは出来たのですが、それを元の文章に戻すプログラムが出来ません。 元の文は一般的で単純な英文として考えての復元なのですがスペースの入れ方、が上手くいきません。 分割方法を見直すべきなのか悩んでおりますが、どなたか簡単な復元プログラムをお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • elmclose
  • ベストアンサー率31% (353/1104)
回答No.4

#1です。 書いていただいた補足に基づき、検討します。 方針としては、入力ストリームを順次読み込みながら、あるいは全部一旦バッファに格納してから、  「単語-スペース-'?'」  「単語-スペース-'.'」  「単語-スペース-'!'」 などといったパターンにマッチするかどうかを判断し、マッチした箇所を置き換える(スペースを除去する)処理をひたすら(パターンにマッチしなくなるまで)行なうプログラムを書けばよいです。 上記のパターン自体をソースコードの中に埋め込んでもOKですし、もう少し汎用性を持たせようと思えば、上記のルール自体を外部ファイルなどから読み込むようにしても良いでしょう。 このあたりのテキスト処理のプログラムを自分でC言語/C++言語などで書きたければ、「字句解析」,「有限オートマトン」などのキーワードで検索し、その理論や手法を勉強されることをお勧めします。コンパイラ作成の基礎ともなる技術です。 ご自分でプログラムを書くことにこだわらず、結果だけを手軽に得たいのでしたら、sed(stream editorの略)というプログラムを使えば、比較的簡単にできます。 書籍「sed & awkプログラミング」 http://www.amazon.co.jp/exec/obidos/ASIN/4900900583/athens-22/ 正規表現入門 http://mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/regex_primer.html これで参考になるでしょうか。頑張ってください。

その他の回答 (4)

回答No.5

C言語で字句解析なら「yacc」と「lex」ですね。 すでに使っていたらすいません。。

yosudesu
質問者

お礼

いえ、参考になりました。 どうも有難うございました。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

1.単語ごとに分割する時、スペースも含めて格納してはいかがですか。(△は1桁の空白です) △#include△<stdio.h>は (△#)(include)(△<)(stdio)(.)(h)としては、どうでしょうか。 復元するときは、単純につなげれば良いだけです。 2.何故、単語ごとに分割するのか、又、どうしてそれを復元する必要があるのか。その辺の事情を説明していただけるともっと良い回答が、得られるかもしれません。 例えば、上記の例で、 △#include△<stdio.h>と #include△△<stdio.h>は、同じ文としたいのか、そうででないのかの判断が、つきません。(△#)と(#)は、同じものとして扱いたいのかどうかも不明です。 その辺の事情も含めて説明されると良いかと思います。

yosudesu
質問者

お礼

ご回答ありがとうございます。 諸事情によりスペースは格納しないでという前提で行っています。 △#include△△△△<stdio.h>となった場合は△△△を格納しないと完全に復元出来ないと思うので、分割方法ももっとこれから検討したいと思ってます。 予定としては、△#include△△△△<stdio.h>となった場合は(△)(♯)(include)(△△△)(<)...としスペースは一個だけ入れれば完成する形にしようと考えております。 分割プログラムも行き詰まったらまたスレを立てるかもしれないのでその時もよかったらまたよろしくお願いします。

  • Rossana
  • ベストアンサー率33% (131/394)
回答No.2

whileループを使って「)」に到達するまでという条件で,繰り返し一字一字出力するっていうアルゴリズムはどうでしょうか?

yosudesu
質問者

お礼

ご回答ありがとうございます。 勉強し直して検討したいと思います。

  • elmclose
  • ベストアンサー率31% (353/1104)
回答No.1

どのような復元プログラムを作りたいのかを明確にしたほうが良いと思います。 ご質問の文面から推察すると、分割した単語間に単にスペースを入れるだけでは不十分なのでしょう。 もしそうだとすると、スペースの場所や数に関する情報を記憶していくか、そのようなスペースに関する情報を生成する規則のようなものが必要となります。 失われた情報を復元することは原理的に不可能ですので。 どうしようとしていて、何が上手くいかないのでしょうか。

yosudesu
質問者

補足

Rossanaさん、elmcloseさんご回答ありがとうございます。 説明不足で申し訳ございませんでした。 今は、テキストファイルにスペース単語スペース単語スペース\nスペース単語...と出力するプログラムは作りました。 そのスペース単語スペース単語...となっているテキストファイルを読み込み、 単語スペース? となっていたり単語スペース.や単語スペース!となっていたらそのスペースを削除。 (スペース単語となっていたらそのスペースを削除してテキストファイルを書き直すプログラムが上手くいかないので作って頂きたいという状況です。 またこれだけでの規則では完全に復元でき無いと言う事は分かっております。 完全では無いというところは目をつぶって頂けたら幸いです。

関連するQ&A