トップページ⇒tech
42コメント16KB

文字列生成プログラム

■ このスレッドは過去ログ倉庫に格納されています
0001StringerNGNG
文字列生成プログラムが欲しいです。
学校の課題というわけではなく、
自分の必要に駆られてです。

標準入力から文字列表現を読みこみ→標準出力へすべての文字列を出力

みたいなので、なにか参考になるようなソースか資料ってありますか?
0002名無しさん@お腹いっぱい。NGNG
へ?
0003StringerNGNG
ちなみに、今、自分で作る場合の文字列表現を考えてみました

'aaa' 文字列
+ 連結演算子 ex 'aaa'+'bbb' → 'aaabbb'
| 選択演算子 ex 'aaa'|'bbb' → 'aaa' と 'bbb'
- 範囲指定演算子 ex 'aa'-'bb' → 'aa' と 'ab' と 'ba' と 'bb'
() 優先順位指定
[] 優先順位指定&省略可能指定

よく分からないかも(^^;

バッカスナウア表現とかいうのを作って、yaccだかなんだかで作るっていうのが
正道なんでしょうか?
0004StringerNGNG
>2さん
ごめんなさい。意味不明ですよね。。。
「文字列生成規則を表す文字列を入力として、その規則から生成されるすべての
文字列を出力する。」っていうプログラムなんですけど、どこかにそれらしい
資料等ありませんか?
0005>4NGNG
形式システムによる定理生成プログラムのことか?
0006名無しさん@お腹いっぱい。NGNG
もうすこし考えてからスレたてろや
0007StringerNGNG
>5さん
すいません。あんまりむずかしいことは分からないんですけど、
ぶっちゃけた話をすると、「インターネット画像ダウンロードプログラム」
を作りたいんです。

たとえば
http://www.hogehoge/picture/pic01.jpeg
http://www.hogehoge/picture/pic02.jpeg
         ・
         ・
http://www.hogehoge/picture/pic99.jpeg

という画像ファイルがあった場合に、MS-DOSコマンドラインから、

a:>picget 'http://www.hogehoge/picture/pic'+('0'-'9')+('0'-'9')+'.jpeg'

とプログラムを起動すると、その画像ファイルをHDD上に保存できるというような。

それで、まずは文字列(URL)を生成しなきゃいけないので、そこのところを考え中です。
車輪の再発明はしたくないので、何か利用できるものがあったら利用しようと思ったのですが。
0008StringerNGNG
>6さん
すいません。出直してきます。
00095>7NGNG
perlと正規表現を覚えたら?
まさにその機能を最初から備えてるよ
0010名無しさん@お腹いっぱい。NGNG
3の様なメタ表現を文字列に含ませたいならば、
正規表現(regular expression = re)が一般的です。
上の機能も、すべて正規表現だけで実現できそうですね。
正規表現の種類は1つではなく、いくつかのバージョンがあります。
perlは拡張正規表現+α(独自拡張)の実装が載っています。
多分、これのソース読むのが近道だと思います。
あとはunixのegrep/vi(ed)/emacsなど。
さらに、vectorとかに行くと、正規表現ライブラリというのもいくつかあります。
なぜperlの正規表現を薦めるかと言うと、
1)流行、一般的(一番使われている)、
2)現在進行形で一番メンテナンスされていて、枯れている(バグが少ない)、
からです。
0011名無しさん@お腹いっぱい。NGNG
あと、正規表現はただでさえ慣れないとわかりにくいので、
ネットに公開する様なアプリに組み込む場合、
独自拡張は避けた方が無難です。(どうせ使ってくれないので…
perl5互換、とかなら使ってくれるかも。
そういや、Windows出身のアプリでは正規表現は全く使われてないですね。
コーダがみんなアホなのでしょうか?…
0012名無しさん@お腹いっぱい。NGNG
C/C++なら、regex.hでも探してこい
0013StringerNGNG
>5さん
アドバイスありがとうございます。
自分も最初は「正規表現で逝ける!!」と思って、フリーのライブラリを
あたってみました。
でも、たいていの正規表現のライブラリって、パターンマッチングは出来ても生成はできないんです。
文字列を順列的に生成してマッチングっていうのでは速度的に問題があると思いまして。。。
ちなみに、perlだと生成もできるんですか?
0014StringerNGNG
>10さん、11さん、12さん
ありがとうございます。最初の説明が言葉足らずでした。
問題は13の通りなんですが、正規表現で生成もできるようなものを探してみたいと思います。
001510=11NGNG
>>14
生成って何のこと?
マッチングした出力結果?
…お話からすると、つまりiriaのurlの展開機能を真似たいクサイですね。
ありゃ、正規表現じゃないですよ…ただの書式出力。
そんなのカウントアップループ一発じゃないか!
ああ真面目に解説して損した…。
0016名無しさん@お腹いっぱい。NGNG
>>11
> そういや、Windows出身のアプリでは正規表現は全く使われてないですね。
> コーダがみんなアホなのでしょうか?…

他人をアホ呼ばわりする前にせめて秀丸ぐらい使ったらどうだ。
001710=11=15NGNG
>>16
そうだね。「全く」は言い過ぎだったよ。
0018StringerNGNG
>10さん
iriaっていうソフトを使ったことがないので真似たいかどうかは分かりませんが、
たぶんそういうようなものだと思います。
iriaを使えば自分で作る必要ないってことですね。
では、ご迷惑かけてすみませんでした。
001910=11=15=17NGNG
>>18
やっぱりそうなのか…
002010=11=15=17=19@優しい人NGNG
まとめ。
1はつまりエロ画像収集厨房だったわけね。
iria知らないって事はワレザーの線は消えるか。
>>1
>自分の必要に駆られてです。
って事は、自慰のお手伝いしちゃったわけだ。
鬱だ…
0021名無しさん@お腹いっぱい。NGNG
実はそれは偽装でやっぱ宿題だったに、1票
0022名無しさん@お腹いっぱい。NGNG
正規表現がマッチする文字列の集合の出力なんてしたら、
あっという間に数が爆発すると思うけど。
0023StringerNGNG
>22さん
そうですよね。正規表現はあくまでマッチングとか置換とかそういう用途向けみたいですね。

で、iriaをダウンロードしてみたのですが、使い方がよく分からない(というかヘルプがついてない)
ので、やっぱり自分で作ろうと思います。
僕の足りない脳みそでは「カウントアップループいっぱつ」で7のような機能を作ることは出来ないので、
勉強もかねて、再帰的下向き構文解析を自分で書いてみることにしました。

<式> := <項> 又は <項>|<項>
<項> := <因子> 又は <因子>+<因子>
<因子> := <文字列> 又は <文字列>-<文字列> 又は (<式>) 又は [<式>]
<文字列> := <英数字及び記号>の0個以上並んだものを' ではさんだもの
<英数字及び記号> := 適当

みたいな感じでやってみることにします。
以上、ご報告まで。
0024StringerNGNG
あ、23だと
'a'|'b'|'c'
とかがエラーになっちゃいますね。
鬱だ…
0025StringerNGNG
訂正版

<式> := <項> 又は <項>|<式>
<項> := <因子> 又は <因子>+<項>
<因子> := <文字列> 又は <文字列>-<文字列> 又は (<式>) 又は [<式>]
<文字列> := <英数字及び記号>の0個以上並んだものを' ではさんだもの
<英数字及び記号> := 適当

では。
0026名無しさん@お腹いっぱい。NGNG
思いっきり遠回りしてるような気がするけど...

変化するのが数字だけなら、とりあえず
picget "http://www.hogehoge/picture/pic%d.jpeg";@`0-99
ってのを作ってみれば?
文字への拡張も簡単にできる。perlならもっと簡単。

でもまあエロパワーを原動力にして構文解析覚えるのも悪くないね。
0027名無しさん@お腹いっぱい。NGNG
10=11=15=17=19=20
のほうが厨房だと思うがいかがか?
0028名無しさん@お腹いっぱい。NGNG
27=Stringerか?
0029名無しさん@お腹いっぱい。NGNG
エロ画像収集厨房呼ばわりされて逆上するStringer。
そして彼の逆襲はここから始まる、、、
0030>27NGNG
発想としては元となるhtmlからリンク先抜き出して
正規表現でフィルタかけるって思うんじゃない?

10=11=15=17=19=20は偉そうなこと言ってるわりに
エロ画像収集の経験が浅いんだろうね(藁
0031名無しさん@お腹いっぱい。NGNG
>>30=27=1
そんなことをおおいばりで自慢するな!
0032名無しさん@お腹いっぱい。NGNG
>勉強もかねて、再帰的下向き構文解析を自分で書いてみることにしました。
どうせならyacc(Bison)で簡潔に書け。
エロ画像は待ってはくれないぞ!
0033>NGNG
まってはくれないが新しいのもいくらでも出てくるからまあいいだろ‥
0034名無しさん@お腹いっぱい。NGNG
外人と日本人(アジア系も含む?)、どっちがいい?
おれはやっぱ日本人。
0035名無しさん@お腹いっぱい。NGNG
>>34
乳は外人。それ以外は日本人!
0036名無しさん@お腹いっぱい。NGNG
cshなら
set digits=(0 1 2 3 4 5 6 7 8 9)
foreach i ($digits)
 foreach j ($digits)
  wget http://www.hoge.com/pic$i$j.jpg
 end
end
といった具合にできるけど、これではだめなの?
0037名無しさん@お腹いっぱい。NGNG
csh(じゃなくてもいいけど)もwgetもWindowsに移植されてるから、これでいいじゃん。
0038StringerNGNG
最近、学校とバイトが時間がつぶれて、PCで遊ぶ時間がなかったです。

>26さん
>でもまあエロパワーを原動力にして構文解析覚えるのも悪くないね。
ついでにお遊びのプログラミングなんで、自己満足出来るようなものを書きたいです(^^;
なので、>picget "http://www.hogehoge/picture/pic%d.jpeg";@`0-99 っていうのは
あんまり自己満足できそうにないので、7みたいなのを目指してみます。

>36さん@`37さん
「コマンドラインで一発!!、エロ画像で三発!!」っていうのがうりなんで、、、
エロ画像を得るために、毎回スクリプト書くのめんどくさいじゃないですか。。。

>32さん
自分で書いてみましたが、自分でもまともに動くかどうかよく分からない、
保守性のホの字もない、条件分岐の塊のようなコードが出来あがってしまったので、
これからyaccをやってみようと思います。

参考までに、今まで書いたコードは
http://ntt-east.virtualave.net/genstr.lzh
にあります。
たくさんバグがあると思いますので、
実行した結果に対して自分は責任を負いません。
素人が構文解析を自分の手で書くとこういうふうになるという
サンプルとしてお役立てください。(コメントもほとんどないし)
コーディングに対する批判は大歓迎です。

では。アドバイスしてくださった皆さん、ありがとうございました。
0039ななしさん@目立ちたがりの厨房NGNG
>>32
>エロ画像は待ってはくれないぞ!
これ面白いですネ!
俺も使おう。(藁
0040名無しさん@お腹いっぱい。NGNG
webcopyをちょっといじって-kと-Kに正規表現を入れられるようにすれば簡単
0041StringerNGNG
とりあえず動いてるのでyaccは後回し。
文字列生成性交。
今日はトゥナイトで散々がんばったのでおやすみなさい。
参考までに、
ソース(VC++6.0)
http://ntt-east.virtualave.net/gss01109.lzh
実行ファイル(Win32@`その他DLL必要なし)
http://ntt-east.virtualave.net/gse01109.lzh
例によって at your own riskで。

あとはこれをどうhttp/ftpクライアントにつなげていくか…。
wgetに組みこむとか。。。。
バッチファイルかなんかで既存のクライアントと連動とか。
誰かやってください(笑)

とりあえずyacc使ってみよう。
0042StringerNGNG
まどろみのなかでメモリリークに気づき、こっそり修正。
■ このスレッドは過去ログ倉庫に格納されています