Blocs récursifs dans l'éditeur d'Ace

Nous avons notre propre langage de script que nous utilisons. La langue est assez simple, mais elle a une chose «exclusive»: les chaînes sont définies à l'aide de «['et'] '(alors" test "serait [test]) et ces appareils peuvent être à l'intérieur de l'autre:

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

En outre, il n'y a pas de personnage qui échappe. Comment analyser ce bloc en tant que chaîne (mettant ainsi en évidence le [concat([test], [blah])] )? J'ai actuellement la règle suivante:

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

Mais, comme vous l'auriez pu deviner, cela s'arrêtera à la fin du test: ' [ concat ([test ] , [blah])]' …

D'autres exemples sont les suivants:

 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)))]); 

Vous devez ajouter une règle pour [ dans l'état de chaîne interne, essayez

 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();