JavaScript のコメントと文字列No.07445
Iranoan さん 12/08/28 13:20
 
 秀丸担当さん今日は、Iranoan です。
 現在 JavaScript ソースの色付けは、C/Java で代用かと思います。
 しかし JavaScript で正規表現を扱う場合 /〜/ と / で挟むケースがあり
ます。また C 等と同じく \ がメタ・キャラクタになります。そこで、
JavaScript を独立させて欲しい。その上で
(1) / で挟まれた部分の文字列として扱う
(2) 現状では、末尾が / で終わる正規表現 /〜\// で後ろがコメントになっ
    てしまうので、\ をメタ・キャラクタとして扱って欲しい
 こちらの環境は、Windows7+IE8.0+秀丸 Ver.8.20 です。

[ ]
RE:07445 JavaScript のコメントと文字列No.07446
秀まるお さん 12/08/28 15:46
 
 JavaScriptでのRegExpオブジェクトについてちょっと検索してみたんですけど
も、単純に「/ 〜 /」ってことで文字列扱い出来るものでも無いような気がしま
す。

 var pattern = /abc/

 とかはいいですが、

 var n = 100 / 10 / 100;

 とかの / 10 / は文字列という訳では無いです。

 この辺の解釈をどうしたらいいのか大変難しい話のような気がします。

 何か決定的なルールが書いてあるといいのですけども、ちょっとわからないで
す。(今探してますけども)

[ ]
RE:07446 JavaScript のコメントと文字列No.07447
Iranoan さん 12/08/28 17:04
 
 秀まるおさん今日は、Iranoan です。
>  var n = 100 / 10 / 100;
>
>  とかの / 10 / は文字列という訳では無いです。
 確かに。

>  何か決定的なルールが書いてあるといいのですけども、ちょっとわからないで
> す。(今探してますけども)
 私が見た者は、関数引数の物ばかりでしたが、決定的とはいえないですし…。

[ ]
RE:07447 JavaScript のコメントと文字列No.07448
秀まるお さん 12/08/28 17:58
 
 JavaScriptのそのRegExpオブジェクトをカラー表示してくれるエディタがあれ
ば、それを参考に出来るっていうのはあります。で、実は今Windows8上でVisual
Stuido 2012 Expressをインストールし終わった所なんですが、これを使うと
JavaScriptのファイルがカラー表示出来まして、たしかにその

 var n = /abc/;

 とかの「/abc/」部分が文字列の色でカラー表示されるようです。

 最初のスラッシュの前に何があるかによってカラー化されるかどうかが決まる
ようではあります。

 カラー化される例としては、

 ! % & ( - = ~ ^ [ ? , < > ; : {

 辺りみたいで、それ以外の文字があるとカラー化しないっていうロジックのよ
うな気がします。

 これを参考に考えてみます。

 次はV8.30βとかになるのかなぁと思いますけども…。先の長い話になります。

[ ]
RE:07448 JavaScript のコメントと文字列No.07449
Iranoan さん 12/08/28 18:05
 
 秀まるおさん今日は、Iranoan です。
>  次はV8.30βとかになるのかなぁと思いますけども…。先の長い話になります。
 よろしくお願いします。

[ ]
RE:07446 JavaScript のコメントと文字列No.07450
IKKI さん 12/08/28 19:34
 
秀まるおさん、こんにちは。ユーザの IKKI です。

ECMAScript Language Specification が原典ですね。
http://www.ecma-international.org/publications/standards/Ecma-262.htm

7章 (13ページ) にこんな記述があります。引用ここから▼

There are two goal symbols for the lexical grammar. The InputElementDiv symb
ol is used in those syntactic grammar contexts where a leading division (/)
or division-assignment (/=) operator is permitted. The InputElementRegExp sy
mbol is used in other syntactic grammar contexts.

There are no syntactic grammar contexts where both a leading division or div
ision-assignment, and a leading RegularExpressionLiteral are permitted. This
 is not affected by semicolon insertion (see 7.9); in examples such as the f
ollowing:

a = b
/hi/g.exec(c).map(d);

where the first non-whitespace, non-comment character after a LineTerminator
 is slash (/) and the syntactic context allows division or division-assignme
nt, no semicolon is inserted at the LineTerminator. That is, the above examp
le is interpreted in the same way as:
a = b / hi / g.exec(c).map(d);

▲引用ここまで。
曰く、割り算が許される文脈では割り算、それ以外の文脈では正規表現リテラル。
双方が同時に許される文脈は存在しない。
ということですが、じゃあ具体的にどう判定したらいいのかというと
やはり BNF を追うしかないか…。後でやってみます。

●関連情報
Mozilla の JavaScript エンジン「Rhino」はオープンソースです。
 https://developer.mozilla.org/en-US/docs/Rhino
Google の JavaScript エンジン「V8」はオープンソースです。
 http://code.google.com/p/v8/
Javascript のパーサーを Javascript で作った人がいるようです。
 http://www.h4.dion.ne.jp/~unkai/js/js10.html

[ ]
RE:07450 JavaScript のコメントと文字列No.07452
IKKI さん 12/08/29 04:47
 
> Javascript のパーサーを Javascript で作った人がいるようです。
>  http://www.h4.dion.ne.jp/~unkai/js/js10.html

こちらの成果物の中に以下の記述がありますね。引用ここから▼

// 正規表現が続く記号
this.reok3 = /^===|^!==/;
this.reok2 = /^\|\||^\|=|^\^=|^>=|^==|^<=|^&=|^&&|^!=/;
this.reok1 = /^\}|^\||^\{|^\^|^\[|^\?|^=|^;|^:|^,|^\(|^&|^!/;

// 正規表現が続かない記号
this.reng4 = /^>>>=/;
this.reng3 = /^>>>|^>>=|^<<=/;
this.reng2 = /^>>|^<<|^\/=|^\-=|^\-\-|^\+=|^\+\+|^\*=|^%=/;
this.reng1 = /^~|^\]|^>|^<|^\/|^.|^\-|^\+|^\*|^\)|^%/;

▲引用ここまで。
つまり、空白類文字を除去した上で、
=== !== || |= ^= >= == <= &= && != } | { ^ [ ? = ; : , ( & !
の後のスラッシュは正規表現。
>>>= >>> >>= <<= >> << /= -= -- += ++ *= %= ~ ] > < / . - + * ) %
と英数字の後のスラッシュは割り算。
ということで良さそうです?

# 改行の扱いは単純ではなさそう…。

[ ]
RE:07452 JavaScript のコメントと文字列No.07453
秀まるお さん 12/08/29 09:31
 
 IKKIさん毎度詳しい情報ありがとうございます。

 秀丸担当の話によると、実は/〜/の正規表現のカラー化についてはPerlの
カラー化の処理でも似たようなことをしてるそうですが、完全に正しく判定する
には至ってないんだそうです。JavaScriptでも完全に正しく判定するのは難しい
んじゃないかという話です。

 とりあえずIKKIさんから教えていただいた情報と、さらには現状でPerl用にや
ってる処理を理解してからどうすべきか考えたいと思います。

 ってことで今のところ保留扱いにさせていただきまして、他にたまってる仕事
を先にしようかなぁと思います。

[ ]
RE:07445 JavaScript のコメントと文字列No.07463
Iranoan さん 12/08/31 14:19
 
 秀まるおさん今日は、Iranoan です。
 文字列の賢に関しては一先ず保留という事で了解です。
> (2) 現状では、末尾が / で終わる正規表現 /〜\// で後ろがコメントになっ
>     てしまうので、\ をメタ・キャラクタとして扱って欲しい
に付いてはどうでしょう?
 文字列とした上で、と思っていましたが、文字列の外でもメタ・キャラクタ
とする訳にはやはりいかないでしょうか?
 /〜\// で、しかもこの後ろに括弧があると、コメント扱いで、対応する括
弧がずれてしまうのが今一番残念なんですよね。

[ ]
RE:07463 JavaScript のコメントと文字列No.07464
秀まるお さん 12/08/31 14:43
 
 /〜\//   のようなケースで「\//」がコメントの開始にないようにするには、
結局は「/〜/」の部分をうまく解釈しないとダメって話になるんじゃないかと思
います。

 「//」の直前の文字が「\」だったらコメント扱いにしないようにって訳にも
いかないと思うし。(「\\//」って書いてあるかもしれないし)

[ ]
RE:07452 JavaScript のコメントと文字列No.07465
colder さん 12/08/31 15:52
 
colderです。
>つまり、空白類文字を除去した上で、
>=== !== || |= ^= >= == <= &= && != } | { ^ [ ? = ; : , ( & !
>の後のスラッシュは正規表現。
>>>>= >>> >>= <<= >> << /= -= -- += ++ *= %= ~ ] > < / . - + * ) %
>と英数字の後のスラッシュは割り算。
>ということで良さそうです?
これでいいのなら、ユーザ定義の複数行コメント定義で出来ないですかね。
とりあえず、書いてみた。

/<HilightMulti>
/0003,00000003,00,00,00000002,"//",00000002,""
/0003,00000002,00,00,00000002,"/*",00000002,"*/"
/0014,00000002,00,5C,00010003,"(?<!((>>>|>>|<<|[\\-+*%/&])=?|/=|--|\\+\\+|[~
\\]></.)\\c])\\s*)/",00000002,"/"
/0014,00000002,00,5C,00000002,"\"",00000002,"\""
/0014,00000002,00,5C,00000002,"'",00000002,"'"

># 改行の扱いは単純ではなさそう…。
これが絡むとユーザー定義では無理そうですね。

[ ]
RE:07464 JavaScript のコメントと文字列No.07466
Iranoan さん 12/08/31 18:25
 
 秀まるおさん今日は、Iranoan です。
>  「//」の直前の文字が「\」だったらコメント扱いにしないようにって訳にも
> いかないと思うし。(「\\//」って書いてあるかもしれないし)
 書き方が悪かったかな。
 正しくは、\ をエスケープ文字として扱うようにする訳にはいきませんか?
でした。

[ ]
RE:07466 JavaScript のコメントと文字列No.07467
秀まるお さん 12/09/03 10:31
 
>  正しくは、\ をエスケープ文字として扱うようにする訳にはいきませんか?
> でした。

 それでとりあえずJavaScriptでの正規表現パターンがコメントの色になってし
まうのが回避出来て、しかもコメントの色になるべき所がすべて正しくコメント
の色になってくれるのかどうかというと…、何かダメなパターンがあるんじゃな
いかという気がします。

 その辺ろくに調べもせずにただプログラムだけ直して、カラー構文として
「JavaScript」を追加してしまうのはちょっといいかげん過ぎる気がします。

 ってことで、とにかく現段階では詳しい調査もせずに手を付けるのは怖いかな
ぁという感じです。

[ ]
RE:07467 JavaScript のコメントと文字列No.07468
Iranoan さん 12/09/03 16:27
 
 秀まるおさん今日は、Iranoan です。
>  ってことで、とにかく現段階では詳しい調査もせずに手を付けるのは怖いかな
> ぁという感じです。
 そうですか。
 解りました。

[ ]