0

玩具言語の文法を説明しようとしています。の内容は次のtokens.lexとおりです。

/* Simple scanner for a toy language */

%{
/* need this for the call to atof() below */
#include <string.h>
#include <math.h>
%}

IDENTIFIER [a-z][a-z0-9]*
DIGIT      [0-9]

%%
{DIGIT}+ {
  printf("int: %s (%d)\n", yytext, atoi(yytext));
  yylval.string = new std::string(yytext, yyleng);
} /* define int type */

{DIGIT}+"."{DIGIT}+ {
  printf("float: %s (%d)\n", yytext, atof(yytext));
  yylval.string = new std::string(yytext, yyleng);
} /* define float type */

b[\'\"]{IDENTIFIER}[\'\"] {
  printf("bstream: %s\n", yytext);
  yylval.string = new std::string(yytext, yyleng);
} /* define bstream type */

u[\'\"]{IDENTIFIER}[\'\"] {
  printf("ustream: %s\n", yytext);
  yylval.string = new std::string(yytext, yyleng);
} /* define ustream type */

if|then|begin|end|procedure|function {
  printf( "A keyword: %s\n", yytext );
}

{IDENTIFIER}      printf( "identifier: %s\n", yytext );

"+"|"-"|"*"|"/"   printf( "operator: %s\n", yytext );

"{"[^}\n]*"}"     /* Remove one-line comments */

[ \t\n]+          /* Remove whitespace */

.                 printf( "Unrecognized character: %s\n", yytext );

%%
int argc;
char **argv;
int main(argc, argv);
  {
  if ( argc > 0 )
    yyin = fopen( argv[0], "r" );
  else
    yyin = stdin;
  yylex();
  }

それから私はそれをコンパイルしようとします:

lex tokens.lex && g++ -lfl lex.yy.c

コンパイラはいくつかのエラーを返します:

tokens.lex:51:20: error: expression list treated as compound expression in initializer [-fpermissive]
tokens.lex:51:20: error: invalid conversion from ‘char**’ to ‘int’ [-fpermissive]
tokens.lex:52:3: error: expected unqualified-id before ‘{’ token

ここで何が問題なのですか?私は C/C++ があまり得意ではないので、ここで何が起こっているのかわかりません。私を手伝ってくれますか?ありがとう!

4

2 に答える 2

1

main 関数を記述する正しい方法は次のとおりです。

int main(int argc, char** argv)
{
  if (argc > 1)
    yyin = fopen(argv[1], "r");
  else
    yyin = stdin;
  return yylex();
}
  1. 引数の型は、引数名の前に配置する必要があります
  2. argv 配列の要素 [0] は、プログラム名そのものです。実引数は [1] から始まります。
于 2012-10-21T18:03:50.347 に答える
0

別の回答に記載されているように、 main() 引数の宣言は正しくない 'C' 構文ですが、とにかくこれはすべて間違っています。レクサーは、トークンを出力するだけでなく、トークンを返す必要があります。lex/flex の main() 関数は、0 または -1、または EOS 指示が何であれ、それが返されるまで yylex() を呼び出さなければなりません。それが lex ライブラリにあるものです。

于 2012-10-24T04:24:05.053 に答える