我正在尝试构建 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");}
;
%%
据我所知,我需要一个定义为程序的非终端,整个解析树都可以挂在上面。但我试过了,它似乎没有用。
编辑 - 这是我的“顶级终端”方法:
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
这里有什么错误?
编辑:错误在词法分析器中。