HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0406
レノス文字列リテラルの \ について10解決


レノス

リンク

2010/4/6(Tue) 01:26:19|NO.31809

hsp3.21 から、標準に mod_regexp が追加されて、正規表現が使いやすくなりました。
ますます hsp が便利になってありがたいのですが、正規表現のパターンを
文字列リテラルで書くときに、どうしても \ が大量になり、わかりにくくなってしまいます。

そこで、\ がエスケープシーケンスとして動作しないような文字列の表現方法を
新たに導入してほしい、というのが要望です。

例: Ruby の %!...! や Python の r"..." など。

できればよろしくお願いします。



この記事に返信する


レノス

リンク

2010/4/6(Tue) 01:44:20|NO.31810

記法については、いろいろあるようですが、 良い記法が確立されていないようなので、
勝手ながら <"..."> を提案します。

理由:
1. 見た目や色分け事情を考慮すると二重引用符 " は必要そう。
2. 文字列中に " を埋め込めるように、後ろの " にも記号をつける必要がある。
3. 未使用の記号で、"" とひっつけて違和感がないものといえば < > くらい。
(非常に主観的)



tsuka

リンク

2010/4/6(Tue) 11:09:53|NO.31814

C#とかだと、「@"〜"」ですね。(「"」ダブルクォーテーションの前にアットマーク。)
Rubyなんかだと、「'〜'」ですがHSPだと文字として扱われちゃいますね。



tararirarin

リンク

2010/4/6(Tue) 12:52:31|NO.31815

Javaで配列の要素を囲むカッコには、[] を使ってますが、
HSP もこのカッコだったらなーと思っています。
他でも使っている () とぱっと見区別しやすいし、Shiftキー押さなくていいし(笑)

これ [] をその文字列でも使えるようにってのはどうですか?

(ひょっとして、もうすでにHSPで別な用途に使われてますか?)



tararirarin

リンク

2010/4/6(Tue) 13:00:42|NO.31816

すみません、右カッコと左カッコがくっついて表示されちゃいました。
[] →[ ] です。



レノス

リンク

2010/4/26(Mon) 01:57:18|NO.32267

待ってるだけではなんなので、パッチ作ってみました (遅)。


Index: trunk/hspcmp/token.cpp =================================================================== --- trunk/hspcmp/token.cpp (リビジョン 382) +++ trunk/hspcmp/token.cpp (作業コピー) @@ -305,6 +305,47 @@ s3[a]=0; } +void CToken::Pickstr_woEscSeq(void) +{ + // Strings pick sub (<" .. ">) + // + int a = 0; + unsigned char a1; + + for (;;) { + a1 = (unsigned char)*wp; + if ( a1 >= 0x81 ) { + if ( a1 < 0xA0 || a1 >= 0xE0 ) { // s-jis code + s3[a ++] = a1; wp ++; + s3[a ++] = *wp; wp ++; + continue; + } + } + + if ( a1 == '\0' ) { wp = NULL; break; } +#ifdef HSPLINUX + if ( a1 == '\n' ) { + wp ++; + line ++; + break; + } +#endif + if ( a1 == '\r' ) { + wp ++; if ( *wp == '\n' ) wp ++; + line ++; + break; + } + if ( a1 == '"' && *(wp + 1) == '>' ) { + wp += 2; + if ( *wp == '\0' ) wp = NULL; + break; + } + + s3[a ++] = a1; wp ++; + } + s3[a] = 0; + return; +} char *CToken::Pickstr2( char *str ) { @@ -351,7 +392,6 @@ return (char *)vs; } - int CToken::CheckModuleName( char *name ) { int a; @@ -549,7 +589,12 @@ wp++;Pickstr(); return TK_STRING; } - + + if ( a1 == '<' && *(wp + 1) == '"' ) { // when "string" without EscSeq + wp += 2; Pickstr_woEscSeq(); + return TK_STRING; + } + if (a1==0x27) { // when 'char' wp++; wp = (unsigned char *)Pickstr2( (char *)wp ); @@ -823,7 +868,7 @@ char *CToken::ExpandStr( char *str, int opt ) { // 指定文字列をmembufへ展開する - // opt:0=行末までスキップ/1="まで/2='まで + // opt:0=行末までスキップ/1="まで/2='まで/3=">まで // int a; unsigned char *vs; @@ -834,15 +879,22 @@ sep = 0; if (opt==1) sep=0x22; if (opt==2) sep=0x27; - s3[a++]=sep; - + + if ( opt == 3 ) { + s3[a ++] = '<'; + s3[a ++] = '"'; + } else { + s3[a ++] = sep; + } + while(1) { a1=*vs; if (a1==0) break; if (a1==sep) { vs++;break; } + if ( opt == 3 && a1 == '"' && *(vs + 1) == '>' ) { vs += 2; break; } if ((a1<32)&&(a1!=9)) break; s3[a++]=a1;vs++; - if (a1==0x5c) { // '\'チェック + if ( opt != 3 && a1==0x5c ) { // '\'チェック s3[a++] = *vs++; } if (a1>=129) { // 全角文字チェック @@ -851,8 +903,13 @@ } } } - s3[a++]=sep; - s3[a]=0; + if ( opt == 3 ) { + s3[a ++] = '"'; + s3[a ++] = '>'; + } else { + s3[a ++] = sep; + } + s3[a] = '\0'; if ( opt!=0 ) { if (wrtbuf!=NULL) wrtbuf->PutData( s3, a ); } @@ -1092,6 +1149,10 @@ *type = TK_STRING; return ExpandStr( (char *)vs+1, 2 ); } + if ( a1 == '<' && *(vs + 1) == '"' ) { // <"〜"> + *type = TK_STRING; + return ExpandStr( (char *)(vs + 2), 3 ); + } if (a1=='{') { // {"〜"} if (vs[1]==0x22) { if (wrtbuf!=NULL) wrtbuf->PutStr( "{\"" ); Index: trunk/hspcmp/codegen.cpp =================================================================== --- trunk/hspcmp/codegen.cpp (リビジョン 382) +++ trunk/hspcmp/codegen.cpp (作業コピー) @@ -368,6 +368,36 @@ return (char *)vs; } +char *CToken::PickStringCG_woEscSeq( char *str ) +{ + // 指定文字列をスキップして終端コードを付加する + // ( <" .. "> ) + // + unsigned char *vs; + unsigned char *pp; + unsigned char a1; + vs = (unsigned char *)str; + pp = vs; + + for (;;) { + a1 = *vs; + if ( a1 == '\0' ) break; + if ( a1 == '"' && *(vs + 1) == '>' ) { + vs += 2; + break; + } + if ( a1 >= 129 ) { // 全角文字チェック + if ( a1 <= 159 || a1 >= 224 ) { + *(pp ++) = a1; + a1 = *(++ vs); + } + } + vs ++; + *(pp ++) = a1; + } + *pp = '\0'; + return (char *)vs; +} char *CToken::PickStringCG2( char *str, char **strsrc ) { @@ -492,7 +522,13 @@ ttype = TK_STRING; cg_str = (char *)vs; return PickStringCG( (char *)vs, 0x22 ); } - + + if ( a1 == '<' && *(vs + 1) == '"' ) { // <"〜"> + vs += 2; + ttype = TK_STRING; cg_str = (char *)vs; + return PickStringCG_woEscSeq( (char *)vs ); + } + if (a1=='{') { // {"〜"} if (vs[1]==0x22) { vs+=2; Index: trunk/hspcmp/token.h =================================================================== --- trunk/hspcmp/token.h (リビジョン 382) +++ trunk/hspcmp/token.h (作業コピー) @@ -195,6 +195,7 @@ // For preprocess // void Pickstr( void ); + void Pickstr_woEscSeq(void); // without escape seaquence char *Pickstr2( char *str ); void Calc_token( void ); void Calc_factor( CALCVAR &v ); @@ -292,6 +293,7 @@ char *GetSymbolCG( char *str ); char *GetLineCG( void ); char *PickStringCG( char *str, int sep ); + char *PickStringCG_woEscSeq( char *str ); char *PickStringCG2( char *str, char **strsrc ); char *PickLongStringCG( char *str ); int PickNextCodeCG( void ); Index: trunk/hsp3/win32gui/hsp3win.cpp =================================================================== --- trunk/hsp3/win32gui/hsp3win.cpp (リビジョン 382) +++ trunk/hsp3/win32gui/hsp3win.cpp (作業コピー) @@ -153,7 +153,16 @@ int tick; while(1) { - + // Window-Message 処理前 + if ( hspctx->runmode == RUNMODE_LOGMES ) { + hspctx->runmode = RUNMODE_RUN; +#ifdef HSPDEBUG + if ( h_dbgwin != NULL ) dbgnotice( dbginfo, 1, 0, 0 ); // Debug Window Notice +#endif + return; + } + + // Window-Message を処理する if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) { if (msg.message == WM_QUIT ) throw HSPERR_NONE; hsp3win_dispatch( &msg ); @@ -177,6 +186,7 @@ case RUNMODE_WAIT: tick = GetTickCount(); hspctx->runmode = code_exec_wait( tick ); + // break fall; case RUNMODE_AWAIT: tick = GetTickCount(); if ( code_exec_await( tick ) != RUNMODE_RUN ) { @@ -201,12 +211,7 @@ hsp3win_debugopen(); #endif break; - case RUNMODE_LOGMES: - hspctx->runmode = RUNMODE_RUN; -#ifdef HSPDEBUG - if ( h_dbgwin != NULL ) dbgnotice( dbginfo, 1, 0, 0 ); // Debug Window Notice -#endif - return; + case RUNMODE_LOGMES: // 処理済み default: return; } Index: trunk/hsp3/win32gui/hsp3gr_wingui.cpp =================================================================== --- trunk/hsp3/win32gui/hsp3gr_wingui.cpp (リビジョン 382) +++ trunk/hsp3/win32gui/hsp3gr_wingui.cpp (作業コピー) @@ -1600,6 +1600,7 @@ switch( prm ) { case 0x40: ptr = &ctx->stat; + size = sizeof(int); break; case 0x41: ptr = ctx->refstr; @@ -1728,7 +1729,7 @@ // code_adddbg( "ディレクトリ", getdir(0) ); code_adddbg( "コマンドライン", getdir(4) ); - code_adddbg( "ウインドゥ最大", wnd->GetBmscrMax() ); - code_adddbg( "カレントウインドゥ", cur_window ); + code_adddbg( "ウインドウ最大", wnd->GetBmscrMax() ); + code_adddbg( "カレントウインドウ", cur_window ); } #endif



レノス

リンク

2010/4/26(Mon) 02:00:05|NO.32268

ランタイム側に関係ない修整がありました……。
それに、長過ぎる上にレイアウトが崩れてしまいました……申し訳ありません。



deque

リンク

2010/4/26(Mon) 17:45:39|NO.32271

>レノスs
あなたのおっしゃる通りですが、それに加えてこのような非技術的なコミュニティーに投稿したとて、
反映されるのが遅れるのは明白では?
OpenHSPから入手したコードはOpenHSPに直接還元すればいいでしょう。

それともOpenHSPに既に還元された上で掲示板にご投稿されたのですか?
しかしHSPユーザーの掲示板にC/C++コードを載せることに何の抵抗も無かったのですか?
「OpenHSPより敷居の低いところで多くの方に――」などといった使い古された戯言は聞きたくはありません。

「長すぎるコードの投稿はご遠慮ください」と言われるのはあなた程の方ならわかりますよね?
ただの自己満足でないことを願っています。



レノス

リンク

2010/4/26(Mon) 21:59:22|NO.32274

> …OpenHSPに直接還元すればいいでしょう
これに関して既にスレを立てていましたので、この1つの要望に関しては、
このスレを利用することにしました。

> 非技術的なコミュニティーに…
非技術的かどうかはともかく、ここの 要望・提案 はおにたま氏も
見ていらっしゃるようですので、前述の通りにしました。

> 長すぎるコード
言い訳になりますが、投稿するまで気付かなかったということでして……。
……私の不注意です。本当に申し訳ありません。



レノス

リンク

2010/4/27(Tue) 16:53:31|NO.32293

(追)
BugTrack (WishList) の方に移動することにしました。
ご迷惑をおかけしました。



GENKI

リンク

2010/4/27(Tue) 21:55:33|NO.32299

とりあえず、昔作ったツールでもどうぞ。
http://homepage3.nifty.com/ghpk/dl/dl05.htm

「\←→\\」の相互変換がHSPエディタ上で出来ると便利かもしれませんね。



ONION software Copyright 1997-2023(c) All rights reserved.