2

次のことについて助けが必要です: Web GUI にMonaco エディター ( https://github.com/Microsoft/monaco-editor ) を、RobotFramework のようなテキスト ファイルのエディターとして実装しています ( http://robotframework. org ) スペース区切りの構文。各キーワード/引数は、2 つ以上の連続するスペースを使用して区切られます。キーワード/引数には、連続していない場合、1 つ以上のスペースが含まれる場合もあります。

Monarch トークナイザーを使用して、使用される引数の数がわかっている行に一致する正規表現を正常に記述していますが、いくつかのキーワードは、任意の数の引数を提供する可能性を提供します。

          keyword           arg1          arg2          ...          argN     
^^spaces^^       ^^spaces^^     ^^spaces^^    ^^spaces^^   ^^spaces^^

各引数には「argument」というクラスを、スペースには「separator」というクラスを割り当てたいと思います。キーワードと次のスペースに一致し、arg1..argN 文字列を状態 'arguments' に送信する 1 つのルールが既に配置されています。

arguments: [
    {
        regex: /(\S.*?)(\s{2,})/,
        action: { cases: {
                '$2':  [
                    { token: 'argument', log: 'Matches: `$0`, `$1`, `$2`' },
                    { token: 'separator', next: '@arguments' },
                ],
                '$1':  [
                    { token: 'argument' },
                ],
                '@default': { token: 'eos', next: '@pop' }
            }
        },
    }
],

任意の数の引数とスペースの組み合わせに一致する状態呼び出し自体を作成できると考えました。ただし、トークン化からのコンソール出力は、状態がそれ自体を呼び出さず、代わりに次の行にスキップすることを示唆しています。

私たちが間違ったことを誰か知っていますか?私たちのユースケースに対するより良い解決策はありますか?

ありがとう!


編集:かなり複雑な解決策が見つかりました。それは、いくつかのかなり複雑な正規表現マッチングと、エディターの「switchTo」および「cases」機能の使用を伴う 2 つの交互の状態に依存します。

/* Arguments iterators: argument -> argseparator -> argument -> ... (end of line) */
argument: [
    {
        regex: /(\S.*?)(?=\s{2,}|$)/,
        action: { cases: {
            '@eos': { token: 'argument', next: '@pop' },
            '$1': { token: 'argument', switchTo: '@argseparator' }
        } },
    }
],

argseparator: [
    {
        regex: /(\s{2,}?)(?=\S.*|$)/,
        action: { cases: {
            '@eos': { token: 'separator', next: '@pop' },
            '$1': { token: 'separator', switchTo: '@argument' }
        } },
    }
],
4

1 に答える 1