2010-07-14 3 views
2

Dans ce qui suit:Pourquoi Flex dit-il qu'il s'agit d'une "règle non reconnue"?

space   ([ \t\f\r])+   
opt_space  ([ \t\f\r])*   
cpp    ^{opt_space}#{opt_space} 
word   [A-Za-z_][A-Za-z_0-9]* 
arg_macro  {cpp}define{space}{word} 
/*arg_macro  ^{opt_space}#{opt_space}define{space}{word}*/ 

%% 
{arg_macro}  ; 
%% 

Je reçois un message d'erreur

 
test.l:9: unrecognized rule 

Si je décommenter la deuxième version de arg_macro et de commenter le premier, le message d'erreur disparaît.

Des idées pourquoi?

Répondre

1

Si vous supprimez le ^ de la définition cpp et que vous le placez dans la définition arg_macro, il est satisfait.

space   ([ \t\f\r])+ 
opt_space  ([ \t\f\r])* 
cpp    {opt_space}#{opt_space} 
word   [A-Za-z_][A-Za-z_0-9]* 
arg_macro  ^{cpp}define{space}{word} 
+0

OK, merci; Y a-t-il une raison à cela ou l'avez-vous trouvée par essais et erreurs? –

+0

Je jouais autour de trouver la sous-partie du problème réel. Mais j'ai ensuite lu la page de manuel flex, etc. Il y a des notes contradictoires, sur une page que j'ai lues, vous pouvez seulement^au début de la chaîne être interprété comme des ancres de début de ligne, sinon c'est juste le jeton. Je suppose que flex pense qu'il est invalide d'imbriquer un jeton de début de ligne après le début de la ligne, ainsi la définition avec cette ancre à l'intérieur n'est pas valide pour l'autre expansion de jeton. Ceci est basé sur le libellé de l'erreur, cela implique que la définition de cpp n'existe pas. Je devrais lire le code pour en savoir plus. –

+0

Ok, en lisant le code flex de gnu: les règles de ligne de départ, semblent être placées dans une liste différente des autres règles, et lors de la résolution des symboles nommés, il recherche la deuxième liste. –

Questions connexes