0

initial.lの作業

%{
 #include "initial.tab.h"
%}

%%
”initial” {return INITIAL;}
[()] {return yytext[0];}
.
%%
int yywrap(void)
{
 return(1);
}

initial.yの作業

%{
  #include <stdio.h>
  #include <stdarg.h>
  #include <string.h>
  #include <stdlib.h>

  #define YYDEBUG 1
  char *filename;
  FILE *fp; 
%}
%token INITIAL

%%
initial:'(' INITIAL ')'
;
%%

main(argc,argv)
int argc;
char **argv; 
{
extern   FILE*   yyin; 
if (argc >1 && !strcmp(argv[1],"-d"))
{
 yydebug =1;
 argc--;
 argv++;
}
 if(argc >1 )
  {
   if((yyin = fopen(argv[1],"r"))==NULL)
     {perror(argv[1]);
      exit(1);
     }
   filename=argv[1];
 }  
  else
   filename="(stdin)" ;

if(!yyparse())
  printf("Done!\n");
    else 
       printf("Fail!\n");

}

データファイル:(初期)

2つの手順は私の手順の一部です。「initial」という言葉はinitial.lで定義されているキーワードですが、flex自体のキーワードでもあるようです。「初期」部分の構文構造を表現する方法は、正しくテストされています。出力:構文エラー失敗!私の完全な手順の出力:zhou:318.19-318.25:構文エラー、予期しない$ end、CHANGEまたはSTEADYまたはINITIALを期待

そのような問題を解決する方法は?

4

2 に答える 2

1

%token TOK_INITIAL "initial" を使用すると、"initial" も変更されたことを意味します {return TOK_INITIAL;} その後、正常に動作します。

また、これを探しています。

パーサーの起動時に何かを初期化する必要がある場合は、%initial-action { some-code } を使用して、yyparse の先頭近くに some-code をコピーするよう bison に指示できます。コードがコピーされる場所は、標準の初期化コードの後に​​あるため、コードに変数宣言をうまく配置することはできません。(それらは受け入れられますが、アクションでアクセスすることはできません。) 独自の解析時変数を定義する必要がある場合は、静的グローバルを使用するか、%parse-param を介して引数として渡す必要があります。

于 2013-12-19T06:01:03.020 に答える
0

Indeedは Flex によって (マクロとして) 定義されているため、他のマクロとINITIAL同様に、この名前を使用しないでください。EOF

INITIAL終端記号 ( ) がその構文 ( ) と完全に等しい必要はないので、"initial"名前を変更するだけTOK_INITIALです。また、エラー メッセージをより明確にしたい場合 (なぜユーザーがTOK_INITIAL意味を理解できるのでしょうか?)、これを使用します。

%token TOK_INITIAL "initial"
于 2013-03-03T08:07:05.113 に答える