Я пытаюсь построить грамматику 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: ошибка была в лексере.