yacc には次の文法があります。
%{
#include <stdio.h>
%}
%token texto SEP ERRO word
%start Ini
%%
Ini: Directivas SEP SEP Conceitos '$'
{ printf("Terminou bem...\n"); return 0; };
Directivas: Directiva
| Directivas SEP Directiva
;
Conceitos: Conceito
| Conceitos SEP SEP Conceito
;
Conceito: word SEP Atributos;
Atributos: Atributo
| Atributos SEP Atributo
;
Directiva: texto;
Atributo: '-' texto;
%%
int main(){
yyparse();
}
int yyerror(char *s){
fprintf(stderr, "%s\n", s);
}
そしてフレックスでは:
%{
#include "y.tab.h"
%}
%%
[a-zA-Z]+ return word;
[a-zA-Z ]+ return texto;
\- return '-';
\n return SEP;
[ \t] ;
. return ERRO;
<<EOF>> return '$';
次のような有効な解析を作成したい:
text line
text line
text line
word
-text line
-text line
-text line
word
-text line
ここで、最初の行は「Directivas」、次に 1 行の空白行であり、次に「Conceitos」が続きます。1 つの Conceitos は 1 つの単語であり、その後に「-」で始まるいくつかのテキスト行が続きます。これらの 'Conceitos は 1 つの空白行で区切られています
しかし、シフト/リデュースの競合が見つかります..私はこれが初めてで、理由がわかりません
私の英語でごめんなさい
ありがとうございました