2012-01-16 17 views
2

私はLexを学ぼうとしています。私はファイルを読み込み、トークンを認識したいというシンプルなプログラムを持っています。Lex認識トークン

今、いくつかのエラーが発生しています。ファイルにはトークンを認識するための行が複数あるので問題はあると思いますか?

ここでは、ここでファイル

fd 3x00 
bk 
setc 100 
int xy3 fd 10 rt 90 

は、私が達成しようとしています出力されます。ここで

Keyword: fd 
Illegal: 3x00 
Keyword: bk 
Keyword: setc 
Number: 100 
Keyword: int 

は私のプログラムである:ここ

%{ 

/* Comment */ 

#include <stdio.h> 
#include <stdlib.h> 

%} 
%% 
fd      {printf("Keyword: fd\n");} 
[0-9][a-z][0-9]  {printf("Illegal: 3x00\n");} 
bk      {printf("Keyword: bk\n");} 
setc[0-9]    {printf("Keyword: setc\n Number: %s\n", yytext);} 
int     {printf("Keyword: int\n");} 
xy3     {printf("ID: xy3\n");} 
fd[0-9]    {printf("Keyword: fd\n Number %s\n", yytext);} 
rt[0-9]    {printf("Keyword: rt \n Number %s\n", yytext);} 
%% 

main(argc, argv) 
int argc; 
char** argv; 
{ 
    if(argc > 1) 
    { 

     FILE *file; 
     file = fopen(argv[1], "r"); 
     if(!file) 
     { 
      fprintf(stderr, "Could not open %s \n", argv[1]); 
      exit(1); 
     } 

     yyin = file; 

    } 

    yylex(); 

} 

は私がエラーでありますコンパイルしようとすると:

In function 'yylex': 
miniStarLogo.l:11: error: expected expression before '[' token 
miniStarLogo.l:11: error: 'a' undeclared (first use in this function) 
miniStarLogo.l:11: error: (Each undeclared identifier is reported only once 
miniStarLogo.l:11: error: for each function it appears in.) 
miniStarLogo.l:11: error: expected ';' before '{' token 
miniStarLogo.l:13: error: expected expression before '[' token 
miniStarLogo.l:13: error: expected ';' before '{' token 

は私のprintfステートメントのエラーですか? はあなたが

私は flex(2.5.35)と gcc(4.6.1)でのMacOS X(10.7.2)で、あなたのコードのコピーをコンパイル
+0

コンパイルエラーのようですが、コンパイルや実行に問題がありますか?それはコンパイルされ、私のために実行されますが、出力はあなたが望むものではありません。 – Kevin

+0

それをコンパイルしようとするとエラーが発生します。私はcc lex.yy.c -o myprog -llを試しました –

+0

どのようにコンパイルして実行できましたか?どのようなコマンドを使用しましたか? –

答えて

1

、私はCコンパイラから得た唯一の苦情は約だったありがとう非プロトタイプの定義はmain()であり、それは私がいつもその警告を有効にしてコンパイルし、yyunput() defined but not used(あなたのせいではない)の言及のためにコンパイルされたからです。

あなたがCを学んでいるので、あなただけの表記を使用する必要があります:

int main(int argc, char **argv) 
{ 
    ... 
} 

または同等。

また、miniStarLogo.lファイルをDOS形式(CRLF行末)に変換しました。flexgccはいずれも結果がOKですが、私の驚きは多少なりともです。あなたのマシンではそうではないかもしれません。私はあなたのテストデータ上のコードを実行したとき

は、私が得た:

Keyword: fd 
Illegal: 3x00 
0 
Keyword: bk 

setc 100 
Keyword: int 
ID: xy3 
Keyword: fd 
10 rt 90 

だから、あなたははるかにあなたが私の推測航法によってである必要はどこオフではありません。


混乱が私の命令を支配する。私はわずかにだまさ -

$ flex miniStarLogo.l 
$ gcc -Wall -Wextra -O3 -g -o lex.yy lex.yy.c -lfl 
miniStarLogo.l:22: warning: return type defaults to ‘int’ 
miniStarLogo.l: In function ‘main’: 
miniStarLogo.l:42: warning: control reaches end of non-void function 
miniStarLogo.l: At top level: 
lex.yy.c:1114: warning: ‘yyunput’ defined but not used 
$ ./lex.yy <<EOF 
> fd 3x00 
> bk 
> setc 100 
> int xy3 fd 10 rt 90 
> EOF 
Keyword: fd 
Illegal: 3x00 
0 
Keyword: bk 

setc 100 
Keyword: int 
ID: xy3 
Keyword: fd 
10 rt 90 
$ 

は(OK:最初の頃、​​私はrmkであり、rmk lex.yy LDLIBS=-lflを走った

は、私が(うーん、それはGCC 4.2.1ではなく4.6.1でした)が、使用しましたmakeの亜種とディレクトリ内のコンパイルルールは、コマンドラインを使用していますが、上記のエラーメッセージを正確に得るためにコンパイルを再実行します)。

パターンを拡張して、 「[0-9]」の代わりに「[0-9]+」という1つ以上の数字を入力します。一致しない文字を扱うルールを調べる必要があるかもしれません。個人的には、改行の直前に空白を避けるために苦労するので、私の基準を満たすために印刷書式を強化する必要があります。しかし、それはプログラムを実行するのには密接な関係はありません。

また、ファイルをDOSからUnixの行末に変換する必要がある場合は、マシン上にある場合は最も簡単なコマンドはdos2unixです。そうでなければ、使用:

$ tr -d '\015' <miniStarLogo.l> x 
$ od -c x 
0000000 % { \r \n \r \n / *  C o m m e n t 
... 
0001560 \n } \r \n 
0001564 
$ mv x miniStarLogo.l 
$ 

私は注意深くvim:set fileformat=dosを使用して改行を追加し、 vim:set fileformat=unixで元に戻すこともできます。これはUnixなので、TMTOWTDI(これはPerlのモットーであること以外にもある)、私はPerlを使用しようとしていません。

+0

私はパテを使ってUnixサーバにログインしています。私も安全なシェルを試しました。私のマシンではこれがなぜうまくいかないのか分かりません。 –

+0

ねえ、私はついにそれを手に入れました。私はあなたのすべての助けに感謝します。あなたは優秀だった。私はvim上でファイルを作成したので、なぜ私は問題があるのか​​わかりません。私はそれを実行するようになったが、私は、プリントfが数字を表示していたコードをコメントアウトしなければならなかった。私はまた、ロードするファイルを持っています。ありがとうございました –

関連する問題