2016-04-22 3 views
1

In grako kann man den @:e verwenden, um einen Override-Operator aufzurufen, der den AST für die vollständige Regel zum AST macht für e. Wenn mehr als ein Element hinzugefügt wird, wird der Eintrag in eine Liste konvertiert. Der Override-Operator ist nützlich, um nur einen Teil der rechten Seite einer Regel wiederherzustellen, ohne sie benennen zu müssen, und dann eine semantische Aktion hinzuzufügen, um den interessanten Teil wiederherzustellen.Hat XText einen Override-Vorgang, um nur einen Teil der rechten Seite einer Regel wiederherzustellen, ohne ihn benennen zu müssen

Hat Xtext etwas ähnliches? Ich weiß, dass + = in einer Liste führen, aber ich kann nicht einen Weg, um nicht etwas zu tun, wie X+=stuff, wobei X ist ein Name, der lhs

Zum Beispiel finden, wie würde man dies übersetzen Xtext

X1 [email protected]:x{',' @:x}* ';' 

Meine ursprüngliche war allerdings

X1: <not sure> +=x (',' <not sure>+=x)* ';' ; 

____EDIT ______ Die Idee ist, dass immer aktuelle Liste in den Aussagen genannt, dh nameList1 list1, list2 nameList2, nameList3 list3

Ich kann die stmt_list -Regel aufrufen, die Elemente in die richtige Liste setzt 'Anweisungen' ('nameList1' list1 + = stmt_list | 'NameList2' list2 + = stmt_list) * 'nameList3' list3 +: stmt_list

stmt_list: 
    stmt_list+=stmt_def (',' stmt_list+=stmt_def)* ';'; 

Also hier stmt_list + = sollte die richtige Liste übereinstimmen, die sie aufgerufen.

So, wenn ich meine Sprache zu schreiben werde, nachdem die Regeln analysiert wurden ich in der Lage, so etwas wie diese

nameList1 foo(a, b, c, d) 
    nameList1 bar(e); 
    nameList2 zap(); 
    nameList3 zip(); 

zu schreiben, wo a, b, c, d, e wird in dem gehen rechte Liste namens

Also im Grunde ist es so etwas wie dies sollte, sondern die ganze Struktur Liste jedes Mal in jeder Art von benannte Liste neu zu schreiben, ich habe eine gemeinsame Regel

('nameList1' list1+=stmt_def (',' list1+=stmt_def)* ';'; 
| 'nameList2' list2+=stmt_def (',' list2+=stmt_def)* ';'; 
'nameList3' list3+=stmt_def (',' list3+=stmt_def)* ';'; 

Antwort

0

Ich bin mir nicht sicher, ob ich Sie verstehe, aber Sie können so genannte zugewiesene Aktionen für eine Art AST-Neuschreiben verwenden.

dies ususally Ausdrücke verwendet schreiben https://typefox.io/parsing-expressions-with-xtext

Sie so etwas wie das folgende tun könnte, aber ich weiß nicht, ob dies ist, was Sie

Model: 
    (things+=Thing ";")* 
; 

Thing: 
    SimpleThing (({ThingList.things+=current}"," things+=SimpleThing) ("," things+=SimpleThing)*)? 
; 

SimpleThing: 
    name=ID 
; 
+0

hinzugefügt bearbeitet zu meiner Frage zu tun, wollen besser zu erklären . Ich habe zwei Fragen über Ihre aktuelle Antwort wo definieren Sie Dinge. können die Dinge entweder eine Sache oder eine einfache Sache enthalten, und eine Sache kann auch eine einfache Sache enthalten? warum sites.list hat .things? – Quantico

+0

ich verstehe immer noch nicht, was Ihre Anforderungen sind. Kannst du das anhand eines Modells und der Art erklären, die du erschaffen hast? In meinem Fall kann ein Ding entweder eine einfache oder eine Dingliste sein, die eine Liste von einfachen Dingen ist. (Ich schreibe das Komma, es wird automatisch in eine Liste umgewandelt.) und die linke Seite (aka '' 'current'''ist als Mitglied dieser Liste zugewiesen).Da es in xtext keine Dinge gibt, wie alles eine Liste oder ein Diktat (mit Begriffen von grako doc), aber alles ist ein dict mit der Möglichkeit, dass die (typisierten) Werte eine Liste sein können, muss ich ThingList als explizit benannten Typ einführen –

+0

aber wo hast du ThingList definiert? Auch werde ich versuchen, wieder zu erklären, ich habe 'Statments', die ein Schlüsselwort darunter ist, kann mehrere Listen der Liste sein zum Beispiel Typ1 hat eine Liste von Stmt1. Jede dieser Listen hat eine Liste stmt_list, in stmt_list Ich versuche X in diese stmt_list zu setzen – Quantico

Verwandte Themen