J'ai quelques règles de ANTLR que je ne sais pas comment les faire fonctionnerANTLR grammaire ambiguë?
La première règle est la suivante:
STRING_LITERAL
: '"' (EscapeSequence | ~('\\'|'"'))* '"'
;
La deuxième règle est:
element
: name '=' math_formula ;
math_formula
: '"' expression '"';
L'expression est une expression régulière de type C
Exemple de syntaxe
"count" = "array[3]"
comptage doit être une chaîne, tandis que array [3] est une expression
Mon problème est que le lexer retourne toujours à la fois « nombre » et « tableau [3] » sous forme de chaînes, et le Parser ne peut pas reconnaître l'expression. J'utilise java target.
EDIT: modification de "variable_name" en "count".
EDIT2: a expliqué ma deuxième tentative ci-dessous:
Je peux détecter le début d'expression avec « = « », mais je ne serai pas en mesure de détecter la fin d'expression dans le Lexer, ce qui fausse détection de chaînes de caractères lorsque j'ai 2 éléments séparés par des « »
"count1" = "array[1]",
"count2" = "array[2]"
si je « = « » comme Expression_Début, l'analyseur syntaxique détecté la citation se terminant la première expression, et la citation à partir de la deuxième chaîne de caractères en tant que chaîne ", \ n" qui est évidemment incorrecte.
EDIT 3: Essayer Syntactic prédicats
J'ai changé la règle pour le STRING_LITERAL à
STRING_LITERAL
: (~('=') '"' (EscapeSequence | ~('\\'|'"'))* '"')=> '"' (EscapeSequence | ~('\\'|'"'))* '"'
;
ne fonctionne toujours pas, aussi je ne savais pas comment produire le ~ (» = ') dans la règle elle-même en lui attribuant un label ou quelque chose
Le problème que je pense est que l'expression est une règle Parser, tandis que la chaîne est une règle lexer. Ce que vous avez décrit ci-dessus suppose que l'expression EXPRESSION est la règle lexer, ce qui n'est pas le cas. Ou puis-je comprendre quelque chose de mal (débutant dans ANTLR) –
Non, vous avez raison; J'ai oublié cela. Je pense que quelque chose de similaire peut être fait au niveau de l'analyseur. Je vais y regarder un peu plus quand j'ai le temps. – erickson
protégé a été converti en fragment dans ANTLR v3. –