2010-02-04 5 views
0

J'ai une grammaire ANTLR très simple que j'essaie de faire fonctionner, mais qui échoue misérablement en ce moment. Apprécierais vraiment quelques conseils sur ce ...ANTLR - grammaire de base incluant des caractères inattendus?

root : (keyword|ignore)*; 
keyword : KEYWORD; 
ignore : IGNORE; 

KEYWORD : ABBRV|WORD; 

fragment WORD : ALPHA+; 
fragment ALPHA : 'a'..'z'|'A'..'Z'; 
fragment ABBRV : WORD?('.'WORD); 

IGNORE : .{ Skip(); }; 

Avec l'entrée de test suivant:

"some ASP.NET and .NET stuff. that work." 

Je veut un arbre qui est juste une liste de nœuds de mots-clés,

"some", "ASP.NET", "and", ".NET", "stuff", "that", "work" 

au moment où je reçois

"some", "ASP.NET", "and", ".NET", "stuff. that", 

(pour une raison « » apparaît dans le dernier mot-clé, et il manque « travail »

Si je change la clause de ABBRV à

fragment ABBRV : ('.'WORD); 

puis qui fonctionne très bien, mais je reçois mot-clé (asp) et mot-clé (.net) - séparément - mais j'ai besoin d'eux comme un seul jeton.

Toute aide que vous pouvez donner serait très appréciée.

Répondre

0

Il y a plusieurs choses, d'abord votre règle ignorer l'analyseur ne sera jamais déclenchée et n'a même pas besoin d'apparaître dans cette grammaire (également ignorer la règle racine). Bien sûr, puisque vous étiez en train de déboguer et que vous aviez la règle ignorer, il est beaucoup plus facile à tester (en supprimant le skip(), dans la règle IGNORE lexer). Maintenant, pour expliquer les données de test, car aucun des jetons lexer ne correspond juste à WORD '.' la fin de vos données de test est ignorée en raison de la période juste après le texte. Si vous placez un espace entre «travail» et la période, le dernier mot apparaîtra et la période n'apparaîtra pas, c'est ce que vous voulez. Le lexer ne sait pas quoi faire avec 'travail'. quand ça finit. Si vous ajoutez un autre mot à la fin (mettez un espace entre la période et le nouveau mot), alors «travaillez». est passé des règles lexer comme un jeton IGNORE. J'aurais pensé que le mot serait passé et la période devrait être dans le jeton IGNORE seulement.

+0

Merci Wayne - ce qui est probablement un signe clair si mon manque d'expérience avec ANTLR - mais en utilisant ANTLRWorks je reçois NoViableAltExceptions sans la règle « Ignorer »? En outre, l'expression inattendue «stuff. That» revient en quelque sorte en tant que mot-clé plutôt qu'en tant que jeton ignorer? Et je ne comprends pas pourquoi? merci pour votre aide –

0

J'ai décidé d'essayer de résoudre votre problème avec une grammaire ANTLR3. C'est ce que j'ai trouvé, avec quelques chaînes attachées:

  • Votre spécification ne contient pas beaucoup de règles, et par conséquent, ma grammaire n'est pas très approfondie.
  • Envisagez d'ajouter KEYW pour faire correspondre plus de jetons.
  • Je n'ai pas d'ANTLR compatible C# pour le moment. Capitaliser le 'skip()' pour le rendre compatible.

    grammar TestSplitter; 
    
    start: (KEYW DELIM!?)* ; 
    KEYW: ('a'..'z'|'A'..'Z'|'.')+ ; 
    DELIM: '.'? ' '+ ; 
    
Questions connexes