摩纳哥编辑器 - 使用递归状态匹配同一行上的任意数量的参数?

时间:2017-03-25 08:20:11

标签: tokenize monaco-editor

我需要以下帮助:我们在Web GUI中实现Monaco编辑器(https://github.com/Microsoft/monaco-editor),作为类似RobotFramework(http://robotframework.org)空格分隔语法的文本文件的编辑器。每个关键字/参数使用两个或多个连续空格分隔。如果关键字/参数不是连续的,则它们也可以包含一个或多个空格。

使用Monarch tokenizer,我们成功地编写了匹配行的正则表达式,我们知道将使用多少个参数,但是,我们的一些关键字提供了提供任意数量参数的可能性:

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

我们想给每个论点一个名为'的论点'以及一个叫做“分隔符”的类的空间。我们已经有一个规则,匹配关键字和以下空格,将arg1..argN字符串发送到状态'参数':

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' }
            }
        },
    }
],

我们认为我们可以让状态调用自身匹配任意数量的arg-spaces组合。但是,来自标记化的控制台输出表明状态不会调用自身,而是跳过下一行。

有谁知道我们做错了什么?我们的用例有更好的解决方案吗?

谢谢!

编辑:找到一个相当复杂的解决方案;它取决于两个交替状态,一些相当复杂的正则表达式匹配和使用" switchTo"和"案例"编辑的功能:

/* 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' }
        } },
    }
],

1 个答案:

答案 0 :(得分:2)

我自己解决了。我不得不使用两个交替状态并执行一些相当复杂的正则表达式匹配" case"和" swtichTo"编辑器的功能来解决我的问题。请参阅上面的编辑。