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
ここでのエラーは何ですか?
編集: エラーはレクサーにありました。