あいかわらず、javascriptのソースコードをreplaceAll(/…/g, myReplacer)で色付けしているうちに
`・・・`の器用な使い方を発見
const date = () => {
const date = new Date();
return new Intl.DateTimeFormat("ja-JP-u-ca-japanese", {
dateStyle: "full", timeStyle: undefined, timeZone: "Asia/Tokyo",
}).format(date);
};
const time = () => {
const date = new Date();
return new Intl.DateTimeFormat("ja-JP-u-ca-japanese", {
dateStyle: undefined, timeStyle: "full", timeZone: "Asia/Tokyo",
}).format(date);
};
const test1 (type) => {
let result = '';
if(type==='date') { result = `${ date() }`;
if(type==='time') { result = `${ time() }`};
return result;
}
test1('date');
test1('time');
すこし粘ってみる
・・・
(type) => {
let result = `
${(type==='date')? `${ date() }` : ''}
${(type==='time')? `${ time() }` : ''}
`;
return result;
}
で通るらしい。
つまり、
`...${...`.....`...}..${...`.....`...}....`
とバッククォータ・リテラルの中で${…}すると、その中で また ` …..` が作れてしまう。
これをRegExp.replaceAll(text)で字句解析するのは無理っぽいなぁ
RegExp.exec(text)で1トークンごとに読んで、(`)バッククォート来た!別のRegExpに差し替えて・・・末端までたどりついたら、元のRegExpに戻りindexを差替えて・・・かな。
spreadSheetのパーサコンビネーションみたいに、
複数のRegExpパターンでimports/exportsみたいなことをする方が無難かな
# exmport:BQLITERAL
BQLITERAL: ( ` ( '${' | '}' | '.*' )* ` )
# exmport:.
# main
COMMENT: (/{2}.*$|\/\*\/?([^/]|[^*]\/|\r|\n)*\*\/)
・・・
BQLITERAL: (`) # import(BQLITERAL)
👈多分この部分は RegExp.exec()の戻り値のgroupsにBQLITERALがあったら、サブルーチン呼び出しみたいな感じかな
# .
それもつらいなぁ
( ( ?<= $ { ] ) | ( ・・・ ) | (?= } ) )
で逃げ切れるかな?
とりあえず今はこの辺。
ps.すこし粘ってみた
((\$\{)([^\}]*)(\}))
この${…}パターンを
BQLITERALパターンに
BQLITERAL: (`(\\\\|\\`|[^`]|\r|\n)*`)
組み込んで
(new)BQLITERAL: (`(((\${)([^\}]*)(\}))|(\\\\|\\`|[^`]|\r|\n))*`)
みた。
試してみる
---`aaa${222`333444555`666}aaaa$bbbb${222`333444555`666}`---------
---`aaa${222`333${222`333444555`666}444555`666}aaaa$bbbb${222`333444555`666}`---------
サンプル1では
・・・
[BQLITERAL] : '`aaa${222`'
[SYMBOLE] : '333444555'
[BQLITERAL] : '`666}aaaa$bbbb${222`'
[SYMBOLE] : '333444555'
[BQLITERAL] : '`666}`'
・・・
[BQLITERAL] : '`aaa${222`'
[SYMBOLE] : '333$'
[L_BRACE] : '{'
[SYMBOLE] : '222'
[BQLITERAL] : '`333444555`'
[SYMBOLE] : '666'
[R_BRACE] : '}'
[SYMBOLE] : '444555'
[BQLITERAL] : '`666}aaaa$bbbb${222`'
[SYMBOLE] : '333444555'
[BQLITERAL] : '`666}`'
・・・
から
・・・
[BQLITERAL] : '`aaa${222`333444555`666}aaaa$bbbb${222`333444555`666}`'
・・・
[BQLITERAL] : '`aaa${222`333${222`333444555`666}444555`'
・・・
と多少改善はできてる。
けど、サンプル2では
---`aaa${222`333444555`666}aaaa$bbbb${222`333444555`666}`---------
---`aaa${222`333${222`333${222`333444555`666}444555`666}444555`666}aaaa$bbbb${222`333444555`666}`---------
・・・
[BQLITERAL] : '`aaa${222`333444555`666}aaaa$bbbb${222`333444555`666}`'
・・・
[BQLITERAL] : '`aaa${222`333${222`333${222`333444555`666}444555`'
・・・
[BQLITERAL] : '`666}aaaa$bbbb${222`333444555`666}`'
・・・
つまり${…} のネストは3段目でかなり厳しい。
`...${...`...`...}...${...`...`...}...`
や
`...${...`...${...`...`...}...`...}...${...`...`...}...` ※旧よりはマシな結果
`...${...`...${...`...${...`...`...}...`...}...`...}...${...`...`...}...`
色付けで確認してみると
「BQLITERAL_white_black」と色指定の名前に変えて
【↓組み合わせ】ボタンで正規表現を更新して
【色付け】ボタンを押すと・・・

多少は、マシってだけ。