2010-12-08 15 views
0

J'ai un aspect simple d'un DSL où je peux définir une clé et une valeur en tant que telle:Comment gérer des jetons dans des blocs de texte dans JavaCC?

mykey=\ 
    This is my $REF{useful} 
    multiline 
    string 
    where I terminate with a backslash 
    but I support escaped \\ characters 
    and I wish to handle the value part of this string 
    as 3 blocks in this example. 
\ 

Les trois jetons (pour la partie de la valeur) Je voudrais dans cet exemple sont

  • ValueLiteral == Ceci est mon
  • valuereference == $ {REF utile}
  • ValueLiteral == multiligne etc ....

I défini une règle pour la valeur en tant que telle:

void multiLineValue(): {} { 
    <BACKSLASH><EOL> 
    (
    valuePartLiteralMulti() | 
    valuePartRef() 
)* 
    <BACKSLASH> 
} 

Voici ma définition TOKEN pour le type de chaîne multiligne:

TOKEN : 
{ 
    < MULTILINE_STRING:( ((~["\\"]) 
    | ("\\" 
     (["\\", "'", "\"", "$", "n", "r", "t", "b", "f"] 
     | ["u", "U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"] 
     ) 
    )))+> 
} 

Mon problème est que ma chaîne multi-ligne jeton type consomme également la séquence de caractères des caractères '$ REF {'.

Je voudrais modifier cette chaîne multiligne pour qu'elle arrête de consommer des caractères lorsqu'elle rencontre un "$ REF {" non échappé (mais continuera à lire après une séquence "\ $ REF {").

Toute aide serait grandement appréciée.

Répondre

2

Je ne suis pas sûr, mais dans votre définition de jeton, vous incluez également $ (en unicode?), Peut-être que vous devriez ajouter ~ ("$") (ou l'équivalent unicode) au début.

Ou vous pouvez utiliser syntactique LOOKAHEAD, quelque chose comme LOOKAHEAD (valuePartRef()) ...

P.S. Pouvez-vous avoir plus d'un REF?