J'essaie de construire une grammaire Lisp. Facile, non? Apparemment non.Lisp grammar in yacc
Je vous présente ces entrées et une erreur de réception ...
(1 1)
23 23 23
ui ui
C'est la grammaire ...
%%
sexpr: atom {printf("matched sexpr\n");}
| list
;
list: '(' members ')' {printf("matched list\n");}
| '('')' {printf("matched empty list\n");}
;
members: sexpr {printf("members 1\n");}
| sexpr members {printf("members 2\n");}
;
atom: ID {printf("ID\n");}
| NUM {printf("NUM\n");}
| STR {printf("STR\n");}
;
%%
autant que je peux dire, j'ai besoin d'un seul non terminal défini en tant que programme, sur lequel l'ensemble de l'arbre d'analyse peut se bloquer. Mais j'ai essayé et ça n'a pas l'air de marcher.
modifier - ce fut mon approche "terminal haut":
program: slist;
slist: slist sexpr | sexpr;
Mais il permet des problèmes tels que:
(1 1
Edit2: Le code FLEX est ...
%{
#include <stdio.h>
#include "a.yacc.tab.h"
int linenumber;
extern int yylval;
%}
%%
\n { linenumber++; }
[0-9]+ { yylval = atoi(yytext); return NUM; }
\"[^\"\n]*\" { return STR; }
[a-zA-Z][a-zA-Z0-9]* { return ID; }
.
%%
Un exemple de l'appariement ...
(1 1 1)
NUM
matched sexpr
NUM
matched sexpr
NUM
matched sexpr
(1 1
NUM
matched sexpr
NUM
matched sexpr
Quelle est l'erreur ici?
edit: L'erreur était dans le lexer.
Qu'est-ce que votre sortie ressemble quand il analyse le (1 1 Je ne peux pas voir comment il arrive à un point de? ne pas attendre la fermeture). – Bearddo
Pourriez-vous poster votre fichier lex/flex aussi? Peut-être qu'il y a une erreur. De plus, vous ne devriez pas utiliser les caractères '(' dans la grammaire si vous utilisez un lexer, je ne suis pas vraiment sûr de la façon dont ils s'entendent.) – jpalecek
Ce qui est étrange, c'est que même la liste valide (1 1 1) n'apparaît pas un match pour une liste.Je voudrais essayer deux choses, d'abord rendre les membres récursifs: membres: membres sexpr | sexpr; Deuxièmement, permuter l'ordre de liste dans sexpr: liste | atome; Voir si cela fonctionne – Bearddo