Я пытаюсь построить грамматику Lisp. Легко, правда? Видимо, нет.
Я представляю эти входы и получаю ошибки...
( 1 1)
23 23 23 
ui ui
Это грамматика...
%%
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");}
    ;
%%
Насколько я могу судить, мне нужен один нетерминал, определенный как программа, на котором может зависать все дерево разбора. Но я попробовал, и он, похоже, не работал.
edit - это был мой подход "верхнего терминала":
program: slist;
slist: slist sexpr | sexpr;
Но он позволяет такие проблемы, как:
( 1 1 
Edit2: Код FLEX...
%{
    #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; }
.
%%
Пример пересогласования...
(1 1 1)
NUM
matched sexpr
NUM
matched sexpr
NUM
matched sexpr
(1 1
NUM
matched sexpr
NUM
matched sexpr
Какая ошибка здесь?
edit: ошибка была в лексере.
