【问题标题】:Recursive blocks in Ace editorAce 编辑器中的递归块
【发布时间】:2014-03-31 15:16:34
【问题描述】:

我们拥有自己使用的脚本语言。该语言非常简单,但它有一个“独占”的东西:字符串是使用 '[' 和 ']' 定义的(所以“test”将是 [test]),并且这些大括号可以在彼此内部:

lateinit([concat([test], [blah])])

此外,还有 no 转义字符。 如何将此块解析为一个字符串(从而突出显示[concat([test], [blah])] 块)? 我目前得到以下规则:

     { token: 'punctuation.definition.string.begin.vcl',
       regex: '\\[',
       push: 
        [ 
          { token: 'punctuation.definition.string.end.vcl',
            regex: '\\]',
            next: 'pop' },
          { defaultToken: 'string.quoted.other.vcl' } ],
        },

但是,正如您可能已经猜到的那样,这将在测试结束时停止在大括号处:'[ concat([test ], [blah])] '...

其他例子有:

setexpratt(1, [if(comparetext([yes], [no]), msg([test expression]))]);
terminator([confirm([Are you sure you want to exit?])]);
registerfunction([testfunction], 1, 3, [], [msg(concat([Argument 1: ], p(1), [, Argument 2: ], p(2), [, Argument 3: ], p(3)))]);

【问题讨论】:

  • 嵌套它们的目的是什么?
  • @ExplosionPills 是语法;没有转义字符...我给出的示例执行加载对象后给出的代码。于是concat([test], [blah])再次被解析,然后运行。
  • 那个 json 的东西有什么条件吗?
  • @JavierDiaz 'json 的东西'?你的意思是这里解释的规则定义:github.com/ajaxorg/ace/wiki/…?除了正则表达式,没有其他条件(当它进入推送块时,它会继续直到找到正则表达式 \]
  • @Diamondo25 我不确定正则表达式引擎 PCRE 已经支持递归正则表达式有多强大,所以您可能想尝试一下 (\[(?>[^[\]]+|(?1))*\]) 它会递归地获取 [] 之间的所有内容

标签: javascript regex ace-editor


【解决方案1】:

您需要将[的规则添加到内部字符串状态,尝试

this.$rules = { 
    start: [
        { token: 'string.begin.vcl', regex: '\\[', push: "string" }
    ],
    string : [ 
        { token: 'string.begin.vcl', regex: '\\[', push: "string" },
        { token: 'string.end.vcl', regex: '\\]', next: 'pop' },
        { defaultToken: 'string.quoted.other.vcl' },
    ]
};
this.normalizeRules();

【讨论】:

  • 谢谢,完成了这项工作:)。我知道它比我想象的更先进哈哈
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多