パーサーを実装しましたが、何も出力されません。指定された入力が構文的に間違っている場合、yyerror()
ルーチンに含めても「エラー」は出力されません。また、入力が正しければ、解析ツリーは出力されません。これの考えられる理由は何でしょうか?ファイルではなくファイルに入れmain()
ました。それが考えられる理由ですか?これが主な方法です。.lex
.y
int main( argc, argv )
int argc;
char **argv;
{
++argv, --argc;
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
yyparse();
}
文法ファイルは次のとおりです。
%{
#include "parser.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%}
%union {
char* a_variable;
tree* a_tree;
}
%start file
%token <a_variable> TOKID TOKSEMICOLON TOLCOLON TOKCOMMA TOKUNRECOG TOKDOT TOKMINUS TOKCOLON
%type <a_tree> field file obj ID
%right TOKMINUS
%%
file : /*empty*/ { return NULL; }
| field file { printtree($1, 1); }
;
field : ID TOKCOLON field {$$ = make_op($1, ':', $3); }
| ID TOKCOMMA field {$$ = make_op($1, ',', $3); }
| obj { $$ = $1; }
;
obj : ID TOKSEMICOLON { $$ = make_op($1, ';', NULL); }
;
ID : TOKID { $$ = $1; }
%%
#include <stdio.h>
yyerror(char *str)
{
fprintf(stderr,"error FAIL: %s\n",str);
}
int yywrap()
{
return 1;
}
これが私の.lex
ファイルの外観です。
%{
/* need this for the call to atof() below */
#include <math.h>
#include "parser.h"
#include "idf.tab.h"
%}
DIGIT [0-9]
ID [a-zA-Z]*
%option noyywrap
%%
{ID} |
-?{DIGIT}+"."{DIGIT}* |
-?{DIGIT}+ { yylval.a_variable = findname(yytext); return TOKID; }
";" return TOKSEMICOLON;
":" return TOKCOLON;
"," return TOKCOMMA;
"." return TOKDOT;
"-" return TOKMINUS;
. return TOKUNRECOG;
%%
int main( int argc, char** argv )
{
++argv, --argc;
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
yyparse();
}