2012-03-26 6 views
1

A Tcl verschachtelt String sein kann:Wie schreibe ich die Tcl verschachtelte String-Regel in ANTLR? so etwas wie dieses

{abc {xyz foo {hello world}}} 

Die obigen Klammern werden verwendet, um den Inhalt der Zeichenfolge zu umschließen, sind sie nicht Teil der Zeichenfolge (ähnlich doppelte Anführungszeichen). Und sie können entwertet werden "\{" und "\}" mit Zeichenfolge ändern "foo"-"foo{}":

{abc {xyz foo\{\} {hello world}}} 

Ich habe eine Arbeitslexikalische Regel für die eine ohne die Klammer zu entkommen:

NestedBraces 
    : '{' (~('{'|'}') | NestedBraces)* '}' 
    ; 

Ich versuche, eine finden Möglichkeit, den entweichenden Teil hinzuzufügen, während die verschachtelte Syntax beibehalten wird und bisher nicht erfolgreich war.

Antwort

0

Versuchen Sie folgendes:

NestedBraces 
: '{' (~('{' | '}' | '\\') | '\\' ('{' | '}') | NestedBraces)* '}' 
; 

In der inneren Schleife, Sie passen:

~('{' | '}' | '\\') // anything other than a '{', '}' and '\' 
|      // OR 
'\\' ('{' | '}')  // an escaped '{' or '}' 
|      // OR 
NestedBraces   // recursive call: '{' ... '}' 

Und wenn Sie möchten, die un-escaped Klammern in einem Rutsch von den Token strippen, so etwas wie dies:

NestedBraces 
: Helper {setText($text.replaceAll("\\\\(.)|[{}]", "$1"));} 
; 

fragment Helper 
: '{' (~('{' | '}' | '\\') | '\\' ('{' | '}') | Helper)* '}' 
; 

, die einen Token mit inneren Text "abc xyz foo{ hello world" für die Eingabe schaffen "{abc {xyz foo\{ {hello world}}}". Beachten Sie, dass Sie eine Hilfsregel benötigen: Sie können das Ersetzen und auch nicht den rekursiven Aufruf in einer Regel durchführen.

+0

Dank. Die Syntax, die ich verwendete, war sehr ähnlich: {code} \ nNestedBraces \t: \t '{' (EscapeBraces | ~ ('{' | '}') | NestedBraces) * '}'; {code} – Benjamin

+0

@ user995807, du ' Du bist willkommen. –

0

Danke, Bart.

Nicht in der Lage, den Code richtig in Kommentaren zu geben, so bin Einfügen ich meinen Code hier:

NestedBraces 
: '{'(EscapeBraces | ~('{'|'}') | NestedBraces)* '}'; 
fragment 
EscapeBraces 
: '\\' 
    (
    '{' 
    | '}' 
    ) 
; 
Verwandte Themen