2016-04-08 46 views
2

我正在改进Stata的现有语法以用于Atom,language-stata包。 Stata代码遵循以下模式:一行中的第一个单词是一个命令,一个逗号将选项与命令的对象分开。例如,要在x和y的线性回归没有一个常数,我们可以运行:语法突出显示行中的第一个单词(语法包,用于Atom)

regress y x, noconstant 

三重斜线表示该命令在下面的行继续。因此,前面的代码就相当于:

regress x /// COMMENTS 
y, /// MORE COMMENTS 
noconstant 

我认为语法应突出行的每一个第一个字除非前行包含三斜杠。在上面的两个例子中,它应该突出显示命令regress,但它不应该在第二个示例中突出显示单词ynoconstant。我想像这样的:

  1. 开始捕捉在一行的开始;
  2. 突出显示第一个单词;
  3. 只要行包含三重斜杠就继续捕获;
  4. 停止当我找到没有三重斜线的行的结尾。

我试过几件事。例如:

{ 
    name: 'comment.line.stata' 
    match: '///.*' 
} 
{ 
    begin: '^\\s*(\\w+)' 
    end: '(?<!///)$' 
    beginCaptures: 
     "1": 
      name: 'support.function.stata' 
} 

此代码突出显示每行的第一个单词,不管是否在它之前有三重斜杠。另一方面,

{ 
    name: 'comment.line.stata' 
    match: '///.*' 
} 
{ 
    begin: '^\\s*(\\w+)' 
    while: '///' 
    beginCaptures: 
     "1": 
      name: 'support.function.stata' 
} 

强调文档的第一个字,没有别的。

有没有人有想法解决这个问题?谢谢!

+0

我想更具体的!它听起来如何? –

+0

但是,如果我使用'regress y x,noconstant',它不会识别任何模式。 –

+0

我试图澄清并简单地解决了这个问题。我删除了关于逗号的部分。它看起来更清楚吗? –

回答

0

大厦评论由ccfthis discussion,我想出了,似乎工作:

{ 
    name: 'comment.line.stata' 
    match: '///.*' 
} 
{ 
    begin: '^\\s*([a-zA-Z_]+)(.*)(///.*)$' 
    beginCaptures: 
     "1": 
      name: 'support.function.stata' 
    end: '^([^/]+|/($|[^/]|/($|[^/])))*$' 
} 
{ 
    captures: 
     "1": 
      name: 'support.function.stata' 
    match: '^\\s*([a-zA-Z_]+)' 
}