J'ai une grammaire simple LALR (1), mais je rencontre un problème.LALR (1) liste vide des paramètres pour les fonctions
start ::= spec.
spec ::= MOD STRING top_stmt.
spec ::= top_stmt.
top_stmt ::= stmt.
top_stmt ::= conditional.
stmt ::= expr.
stmt ::= assignment.
conditional ::= IF stmt_list.
expr ::= retval.
expr ::= NOT retval.
retval ::= access.
retval ::= invoke.
access ::= ns_identifier OBJECT_OPERATOR property_chain.
access ::= ns_identifier.
ns_identifier ::= identifier.
ns_identifier ::= ns_identifier NS_SEPARATOR identifier.
ns_identifier ::=.
property_chain ::= property_chain OBJECT_OPERATOR identifier.
property_chain ::= identifier.
identifier ::= VARIABLE.
identifier ::= STRING.
assignment ::= access ASSIGN expr. [ASSIGN]
stmt_list ::= stmt.
stmt_list ::= stmt_list COMMA stmt. [COMMA]
invoke ::= access LPAREN empty_stmt_list RPAREN.
empty_stmt_list ::=.
empty_stmt_list ::= stmt.
empty_stmt_list ::= empty_stmt_list COMMA stmt. [COMMA]
Le point marque la fin de la règle, les bornes entre crochets ont associativité qui leur sont assignées: allouez droit associatif, VIRGULE reste-assoc.
Mais lemon dit qu'il ne peut pas réduire la règle "empty_stmt_list :: =." parce que ce n'est pas connecté au symbole de départ. Je parie que c'est :-)
Il y a aussi un conflit d'analyse pour "invoke", il ne peut pas choisir entre RPAREN et COMMA quand empty_stmt_list est en effet une liste empy d'instructions. Ce que j'essaie de réaliser est d'être en mesure d'analyser les appels de fonction qui n'ont pas de paramètres (vide).
Tout le reste fonctionne comme prévu.
Merci
Modifier: J'ai édité mon message original et affiché toute la grammaire dépouillée.
Votre notation est pas tout à fait conventionnel - est-ce inspiré par ANTLR? Quelles sont les choses entre parenthèses '(A)' et '(B)' Quelle est la signification du seul '.' dans la notation? Il semble être un méta-caractère indiquant la fin de –