tokenize - Monaco Editor - 使用递归状态匹配同一行上的任意数量的参数?

标签 tokenize monaco-editor

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

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

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

我们希望为每个参数提供一个名为“argument”的类,为空格提供一个名为“separator”的类。我们已经制定了一条规则,匹配关键字和以下空格,将 arg1..argN 字符串发送到状态“arguments”:

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”功能的使用:

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

最佳答案

我自己解决了。我必须使用两种交替状态,并与编辑器的“cases”和“swtichTo”功能一起执行一些相当复杂的正则表达式匹配来解决我的问题。请参阅上面我的编辑。

关于tokenize - Monaco Editor - 使用递归状态匹配同一行上的任意数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43014131/

相关文章:

c - 如何标记/拆分包含 C 中的天数和随机数的 .csv 文件中的数据?

nlp - 使用字符嵌入进行 BERT 训练

javascript - 获取/恢复 Monaco 编辑器撤消重做堆栈

reactjs - 如何在不动态导入的情况下在 next.js 中导入浏览器模块

python - 如何使用 Python NLTK 将字符串中的数字转换为单词?

c - 标记多个字符串 C

python - 如何向分词器添加关键字?

monaco-editor - 连接模型的首选方式

monaco-editor - 完成显示的自定义顺序 - 摩纳哥

javascript - 如何使用简单的 JavaScript 或 jQuery 在浏览器中初始化 Microsoft Monaco 编辑器