Avoir la grammaire simple suivante, je voudrais analyser simultanément des chaînes et des nombres:prédicats sémantique pour la chaîne simultanée et numéro analyse syntaxique
grammar Simple;
aRule : 'fs' '(' value["textual"] ')' ;
bRule : 'fi' '(' value["numeral"] ')' ;
cRule : 'f' '(' (value["textual"] | value["numeral"]) ')' ;
value[String k]
: {$k.equals("any") || $k.equals("textual")}? string
| {$k.equals("any") || $k.equals("numeral")}? numeric
;
string
: STRING_LITERAL
;
numeric
: ('+' | '-')? INTEGER_LITERAL
;
STRING_LITERAL
: '\'' (~('\'' | '\r' | '\n') | '\'' '\'' | NEWLINE)* '\''
;
INTEGER_LITERAL
: '0' | [1-9] [0-9]*
;
SPACES
: [ \t\r\n]+ -> skip
;
fragment NEWLINE : '\r'? '\n';
Maintenant, je voudrais analyser les expressions suivantes:
fs('asdf') // works
fi(512) // works
f('asdf') // works
f(512) // fails
Si je passe textual
et numeral
dans cRule
, puis f('asdf')
échoue et f(512)
œuvres.
Des idées?
Update1
grammar Simple;
rules : aRule | bRule | cRule ;
aRule : 'fs' '(' value["textual"] ')' ;
bRule : 'fi' '(' value["numeral"] ')' ;
cRule : 'f' '(' (tRule | nRule) ')' ;
tRule : value["textual"] ;
nRule : value["numeral"] ;
value[String k]
: {$k.equals("any") || $k.equals("textual")}? string
| {$k.equals("any") || $k.equals("numeral")}? numeric
;
string : STRING_LITERAL ;
numeric : ('+' | '-')? INTEGER_LITERAL ;
STRING_LITERAL : '\'' (~('\'' | '\r' | '\n') | '\'' '\'' | NEWLINE)* '\'' ;
INTEGER_LITERAL : '0' | [1-9] [0-9]* ;
SPACES : [ \t\r\n]+ -> skip ;
fragment NEWLINE : '\r'? '\n';
Même w/cette grammaire mise à jour --- comme suggérer par @GRosenberg --- pour f(512)
je reçois toujours no viable alternative at input '512'
. Encore une fois fs('asdf')
, fi(512)
et f('asdf')
travail.
* "cela ne fonctionne pas" * => c'est sans signification, dites-nous * quoi * et * comment * cela ne fonctionne pas, s'il vous plaît voir [mcve]. Aussi, * pourquoi * convoluez-vous votre grammaire comme ça? Pourquoi ne pas faire simplement: 'soit: string | numeric; 'et' aRule: A_STR_FUNC '(' string ')'; 'et ainsi de suite? –
Ceci est juste un extrait simple d'une grammaire beaucoup plus compliquée. Dans la grammaire complète, je dois restreindre les expressions à certains endroits pour être seulement de type "string", int, ou date time, etc .. Donc, pour m'assurer qu'à ces endroits pas/any/expression est permise, je voulais suivre cette approche. –
On dirait que [les prédicats dépendants du contexte ne jouent pas trop bien avec la prédiction] (https://github.com/antlr/antlr4/blob/master/doc/predicates.md#using-context-dependent-predicates).Je * pense * encore que ce que vous essayez de faire est réalisable sans prédicats cependant. –