2010-09-24 26 views
2

Je travaille sur un analyseur JavaCC qui devrait analyser BBcodes.Pourquoi mon analyseur JavaCC n'analyse-t-il pas les jetons de moins de 2 caractères?

code source Mon javacc: patebin.com (Junit test: here)

Le code source fonctionne genre au large, mais il ne veut pas accepter des jetons avec un seul caractère, seules les chaînes de caractères multi sont reconnus.

Il ne parser cette chaîne:

"test[b]bold[/b]nothing[b]bold[/b]after"

Mais pas:

"t[b]bold[/b]nothing[b]bold[/b]after"

Je suis un peu perdu ici, des conseils bienvenus.

+0

Bien que ce ne sera probablement pas plus résoudre votre problème, je remarque dans votre grammaire que vous avez 'Text' à' ( | | | ) * '. Est-ce que ce ne devrait pas être '( | | | ) +', car l'absence de texte n'est pas du texte (à moins que cela ne soit prévu)? – Paul

+0

@Paul, vous avez raison. Je l'ai changé en '+' car j'avais initialement '+' au lieu de '*', c'était juste un mouvement désespéré pour voir si ça changeait de comportement. BTW, il n'a en effet pas aidé. – Kdeveloper

+0

Je ne suis pas familier avec la syntaxe JavaCC mais en regardant la partie 'content()', est-ce que le 'LOOKAHEAD (2)' précédant le 'text()' a une signification? Je suppose que ce devrait être "LOOKAHEAD (1)" ou pas là. –

Répondre

3

Je l'ai compris. Téléchargé JavaCC et compilé tout. Avec l'entrée de caractère, la sortie est:

 
String: t 
Length: 1 
Call: parse 
    Call: body 
    Return: body 
Return: parse 
Exception in thread "main" ParseException: Encountered " <LETTER> "t "" at line 
1, column 1. 
Was expecting one of: 
    <EOF> 
    "[b]" ... 
    "[i]" ... 
    "[u]" ... 
    "[s]" ... 
    "[url]" ... 
    "[url=" ... 
    "[img]" ... 
    "[quote]" ... 
    "[code]" ... 
    "[color=" ... 
    "[br]" ... 
    <EOL> ... 
    <TEXT> ... 
    <TAGCHAR> ... 

Je remarqué qu'il a trouvé un jeton <LETTER> mais n'a pas reconnu comme <TEXT>.

C'est là que réside le problème. Vous avez déclaré tout en tant que jetons et en fonction de l'ordre des définitions de jeton, la chaîne "t" est d'abord une <LETTER>, et non <TEXT>. Déplacez le jeton <LETTER> après <TEXT> et cela devrait fonctionner maintenant. Vous devrez appliquer les mêmes changements pour <DIGIT> s et autres jetons de ce type.

+0

Jeff, merci pour tout le travail! Je pensais que l'erreur donnée n'était pas descriptive, donc je ne l'ai pas inclus. Il s'avère que je ne l'ai pas compris. Je promets, la prochaine fois que j'inclus toujours des messages d'erreur. Merci encore, excellent! – Kdeveloper