0

レックスコード:

identifier [\._a-zA-Z0-9\/]+
comment "//"

<*>{comment}  {
    cout<<"Comment\n";
  char c;
  while((c= yyinput()) != '\n')
    {
    }
}

<INITIAL>{s}{e}{t} {
   BEGIN(SAMPLE_STATE);
   return SET;
}

<SAMPLE_STATE>{identifier} {
    strncpy(yylval.str, yytext,1023);
    yylval.str[1023] = '\0';
  return IDENTIFIER;
}

上記の lex コードでは、「// set name」が解析されるときにエラーは発生しません。解析された文の「//」の後のスペースに注意してください。ただし、「//セット名」が解析されると、エラーが報告されます。私が間違っているところを指摘できますか?ありがとう。

エラーはによってキャッチされyyerror、報告されます

SampleParser.y:43: int CMTSTapTestSeq_yyerror(char*): Assertion `0 && "Error parsing Sample file\n"' failed. 

この主張は私が追加したものです。

4

1 に答える 1

0

あなたが提供したコードは正常に動作し、あなたが示した欠陥がないため、例を単純化する際に間違いを犯したと思います. コードを作成してテストしました (便宜上、C++ ではなくCを使用しました)。ただし、問題をより適切に説明するコードを追加して、後で質問を投稿したようです。私もそう答えました。

s s
e e
t t
identifier [\._a-zA-Z0-9\/]+
comment "//"

%s SAMPLE_STATE

%{
//#include <iostream>
//using namespace std;
#include <stdio.h>
#define SET 1
#define IDENTIFIER 2
#define yyinput input
%}

%%
<*>{comment}  {
   // cout<<"Comment\n";
   printf("Comment\n");
  char c;
  while((c= yyinput()) != '\n')
    {
    }
}

<INITIAL>{s}{e}{t} {
   BEGIN(SAMPLE_STATE);
   //return SET;
   printf("SET\n");
}

<SAMPLE_STATE>{identifier} {
    //strncpy(yylval.str, yytext,1023);
    //yylval.str[1023] = '\0';
  //return IDENTIFIER;
  printf("identifier");
}

は次の両方を受け入れます。

//set name
// set name
于 2015-04-23T08:50:48.167 に答える