非常に単純な yacc/lex プログラムに問題があります。基本的な手順をいくつか忘れている可能性があります (これらのツールを使用してから長い時間が経ちました)。
私の lex プログラムでは、次のようないくつかの基本的な値を指定します。
word [a-zA-Z][a-zA-Z]*
%%
":" return(PV);
{word} {
yylval = yytext;
printf("yylval = %s\n",yylval);
return(WORD);
}
"\n" return(ENDLINE);
私の yacc プログラムでは、文法の始まりは次のとおりです (TranslationUnit は %start です)。
TranslationUnit:
/* Nothing */
| InfoBlock Data
;
InfoBlock:
/* Nothing */
| InfoBlock InfoExpression {}
;
InfoExpression:
WORD PV WORD ENDLINE { printf("$1 = %s\n",$1);
printf("$2 = %s\n",$2);
printf("$3 = %s\n",$3);
printf("$4 = %s\n",$4);
}
| ... /* other things */
;
Data:
... /* other things */
入力を使用してプログラムを実行すると:
keyword : value
私は少なくとも得ると思った:
$1 = keyword
$2 = keyword // yylval not changed for token PV
$3 = value
$4 = value // yylval not changed for token ENDLINE
実際に私は得る:
$1 = keyword : value
$2 = keyword : value
$3 = value
$4 = value
この結果はわかりません。少し前に文法を勉強したことがありますが、今はすべてを覚えていなくても、重要な間違いは見当たりません...
よろしくお願いします。