J'ai la production suivante:Comment dire à ANTLR de préférer une alternative à l'autre?
expression
: primary # stubLabel
| expression '.' Identifier # stubLabel
| expression '.' 'this' # stubLabel
| expression '.' 'new' nonWildcardTypeArguments? innerCreator # stubLabel
| expression '.' 'super' superSuffix # stubLabel
| expression '.' explicitGenericInvocation # stubLabel
| expression '[' expression ']' # stubLabel
| Identifier arguments # namedMethodInvocation
| expression '.' Identifier arguments # namedMethodInvocation
| expression arguments # unnamedMethodInvocation
| // Lots of other patterns...
;
Je souhaite faire l'analyseur essayer les modèles namedMethodInvocation
avant d'essayer unnamedMethodInvocation
. Cela ne se produit pas automatiquement car ANTLR essaie de choisir l'alternative avec la correspondance la plus longue, au lieu d'utiliser une première politique de correspondance. Comment puis-je le forcer à le faire?
éditer: Désolé, j'ai oublié de publier le lien vers le fichier de grammaire ci-dessus. Here c'est.
Veuillez indiquer la règle de production «primaire». – saka1029
@ saka1029 Je suis tellement désolé, j'ai négligé de lier le fichier de grammaire complète dans mon message! Le fichier de grammaire peut être trouvé [ici] (https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L540). La règle de production «primaire» est [ici] (https://github.com/antlr/grammars-v4/blob/master/java/Java.g4#L540). –
Dans les règles d'analyseur, les alts sont testés un par un, de haut en bas (comme écrit dans la grammaire) et le premier correspondant gagne. La commande des alts est une affaire en soi, car elle détermine un certain nombre de choses (par exemple, la précédence). –