2016-04-08 3 views
2

Ich arbeite an der Verbesserung der bestehenden Grammatik für Stata für die Verwendung auf Atom, das language-stata Paket. Der Stata-Code folgt einem Muster: Das erste Wort in einer Zeile ist ein Befehl, und ein Komma trennt die Optionen von den Objekten des Befehls. Zum Beispiel kann eine lineare Regression von Y auf X ohne eine Konstante auszuführen, Ausführen:Syntax Hervorhebung für das erste Wort in Zeile (Grammatik-Paket für Atom)

regress y x, noconstant 

A triple slash bedeutet, dass der Befehl in der folgenden Zeile fortgesetzt wird. So ist der vorherige Code entspricht:

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

Ich denke, dass die Grammatik jedes erstes Wort eine Zeile markieren sollte, es sei denn, die vorhergehende Zeile einen dreifachen Strich enthält. In den beiden obigen Beispielen sollte es den Befehl regress hervorheben, aber es sollte die Wörter y oder noconstant im zweiten Beispiel nicht hervorheben. Ich stelle mir so etwas vor:

  1. Beginn der Erfassung am Anfang einer Zeile;
  2. Markieren Sie das erste Wort;
  3. Fortsetzung der Erfassung, solange die Zeilen einen dreifachen Schrägstrich enthalten;
  4. Stop, wenn ich das Ende einer Zeile ohne einen dreifachen Schrägstrich finden.

Ich habe ein paar Dinge ausprobiert. Zum Beispiel:

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

Dieser Code unterstreicht das erste Wort jeder Zeile, ob ein Dreifachstrich ihr vorausging. Auf der anderen Seite,

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

markiert das erste Wort des Dokuments und nichts anderes.

Hat jemand eine Idee, um das zu lösen? Vielen Dank!

+0

ich genauer zu sein versucht! Wie hört es sich an? –

+0

Aber es erkennt kein Muster, wenn ich 'regress y x, nonconstant' verwende. –

+0

Ich versuchte zu klären und einfach das Problem ein wenig. Ich habe den Teil über das Komma entfernt. Scheint es klarer zu sein? –

Antwort

0

Aufbauend auf Kommentare von ccf und this discussion, kam ich mit etwas, das scheint zu funktionieren:

{ 
    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_]+)' 
} 
Verwandte Themen