• 締切済み

windowsとlinuxでのlexの実行結果の差

プログラミング初心者です。 lexでプログラムを作成しています。 centOSでlexのプログラムを作製し、コンパイルして実行したら、全て理想通りに動作しました。 Makefileと実行結果を以下に示します。 **Makefile** CC = cc y.tab.c lex.yy.c YACC = yacc -d LEX = lex all : parser y.tab.c y.tab.h : parser.y $(YACC) parser.y lex.yy.c : scanner.l $(LEX) scanner.l parser : y.tab.c lex.yy.c $(CC) -lfl -o parser clean : rm y.tab.c rm y.tab.h rm lex.yy.c rm parser **実行結果** program is inputted. ***initial call*** PL0A var is inputted. n ***insert call*** =name= =address= =kind= n 10 global sum ***insert call*** =name= =address= =kind= n 10 global sum 10 global ***lookup call*** ==look== =name= =kind= n n global ***lookup call*** ==look== =name= =kind= sum sum global ***lookup call*** ==look== =name= =kind= n n global ***lookup call*** ==look== =name= =kind= sum sum global ***lookup call*** ==look== =name= =kind= n n global ***lookup call*** ==look== =name= =kind= sum sum global ***lookup call*** ==look== =name= =kind= n n global ***lookup call*** ==look== =name= =kind= n n global このプログラムを、windows7のcygwin(フルインストール)下で、コンパイルして実行しました。 Makefileの中身は変更していません。 **実行結果** $ ./parser pl0a.p program is inputted. ***initial call*** PL0A var is inputted. n ***insert call*** n 10 global sum ***insert call*** sum 10 global ***lookup call*** ==look== sum global Error n sum global ***lookup call*** ==look== sum global Error sum sum global ***lookup call*** ==look== sum global Error n sum global ***lookup call*** ==look== sum global Error sum sum global ***lookup call*** ==look== sum global Error n sum global ***lookup call*** ==look== sum global Error sum sum global ***lookup call*** ==look== sum global Error n sum global ***lookup call*** ==look== sum global Error n sum global 全然違う結果になってしまいました。lexをflexに、ccをgccに修正などしても変化はありませんでした。 同じように出力するにはどうすれば良いのでしょうか?

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

WindowsとLinuxで挙動が違う、と言われてまず思いつくのが改行コードの違いです。 fileコマンドやnkf --guess等で確認するとどうなってますか? CygwinはWindows上で動作していますが、基本はLinuxと同じLFを使います。 Windows専用FTPツールでtextモードでGetしたり、Windows用のテキストエディタで作成したりすると、CRLFになってしまいます。

janneofworld
質問者

お礼

確認しましたが特に問題は無いようです。 根本的な解決とはなりませんが、xwindowを用いてlinux端末に接続して遠隔操作をすることでwindowsから実行することにしました。 ありがとうございました。

関連するQ&A

  • YaccとLex

    macのターミナルでYaccとLexのプログラムを実行しようと思っています。Yaccプログラム(ren.y)は bison -y ren.y の後 gcc y.tab.c -ly -o a.exe の後更に ./a.exe でしっかり実行できます。しかし、YaccとLexのプログラム(Yaccプログラムはren1.y、Lexプログラムはren2.l)において、bison -dv -y ren1.y の後、flex -l ren2.l までのコンパイルはできるのですが、gcc y.tab.c lex.yy.c -ly -lfl -lm -o a でコンパイルリンクしようとすると、 ld: library not found for -lfl clang: error: linker command failed with exit code 1 (use -v to see invocation) と表示されエラーが生じてしまいます。 macにはXcodeもインストールしてあります。 どうしてy.tab.cとlex.yy.cのコンパイルリンクと実行プログラムaの作成に失敗するのでしょうか?

  • Cygwin(gcc) lexライブラリ

    WindowsXPにCygwinのすべての項目をInstallにしてインストールして bison -d abc.y flex abc.l と実行し、 abc.tab.c , abc.tab.h , lex.yy.c ができた状態で gcc abc.tab.c -ll とした時 /user/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -ll collect2: ld returned 1 exit status とメッセージが表示されコンパイルできないでのですが gccには標準lexライブラリが無いのでしょうか? それとも別のことが原因なのでしょうか? このエラーの回避法、もしくは別のソフトなどでこれと同様のことができるなら教えてください。

  • yaccのコンパイル法

    Bisonを実行して出力されたPekePeke_Tab.c をコンパイル(ボーランドを使用)すると、_yyerrorが未解決です のコメントが出てうまく行きません。 コマンドは bcc32 PekePeke_Tab.c libmain.obj です。 ライブラリの不足でしょうか? ちなみに Flex のコンパイルはうまく行きました。 bcc32 lex.yy.c libmain.obj libwrap.obj でOKでした。 yacc関連の書物やWEBなどは、yacc lex 本体の説明だけで、コンパイルの説明が皆無なので困っています。  

  • lex、yaccファイルのコンパイラができません。このような警告がでます。足りないライブラリはなんでしょうか。

    lexとyaccを復習しているのですがこのサイト​http://cis.k.hosei.ac.jp/~nakata/lectureCompiler/YaccLex/6.2.html​の説明にあるサンプルを実行しようとしているのですがうまくいきません。 以下の作業で何が問題だと考えられるでしょうか。 sample.y sample.l のふたつのファイルを http://cis.k.hosei.ac.jp/~nakata/lectureCompiler/YaccLex/6.htmlのような手順でコンパイルしようとした結果 こうなってしまいます。 ----------------------実行結果-------------------------- ken@ubuntu-vm:~/ken/1$ yacc -d sample.y ken@ubuntu-vm:~/ken/1$ lex sample.l ken@ubuntu-vm:~/ken/1$ cc y.tab.c -ly -ll -o executablesample.y: In function ‘yyparse’: sample.y:8: 警告: incompatible implicit declaration of built-in function ‘printf’ ken@ubuntu-vm:~/ken/1$ -------------------------------------------------------- ------------------sample.yの内容---------------------- %token NL %token NUMBER %left ADDOP %% list: /* Empty */ | list expression NL {printf("%d\n",$2);} ; expression: expression ADDOP expression {$$=$1+$3;} | NUMBER {$$=$1;} ; %% #include "lex.yy.c" #include <stdio.h> /*追加してみましたが変わりませんでした。"stdio.h"にしてもダメでした*/ ----------------------------------------------------- -------------------sample.lの内容---------------------- %{ #include "y.tab.h" #include <stdio.h> /*追加してみましたが変わりませんでした"stdio.h"にしてもダメでした */ %} %% "+" return(ADDOP); [0-9]+ {sscanf(yytext,"%d",&yylval); return(NUMBER);} [ \t] ; \n|\r|\r\n return(NL); . return(yytext[0]); %% -------------------------------------------------------- #include が入ってないせいだと思い、上記のように追加してみたのですが見当違いなことをしているように思えます。ちなみにCでprintfを使うと普通にコンパイルできます。 必要なライブラリが入ってないのだとしたら何かわからず困っています。 最近VMwareでUbuntuは始めたばかりです。 パッケージは build-essentials yum liby-dev bison などをインストールしました。 何が足りないでしょうか。。すいません、お願いします。

  • yacc,lexで作ったプログラムが正しく動きません。

    加減乗除ができ、平方根や常用対数を計算でき、PIが円周率3.14159265に変換される、負の数、浮動小数点数を扱える電卓のインタプリタ(数式を入力すると計算結果を表示して終了するプログラム)をyacc構文解析とlex字句解析を用いて以下のようにしました。 yacc %{ #include<stdio.h> #include<math.h> int yyerror(char* s); %} %union{ double num; } %type<num> E T F %token<num> NUM SQRT LOG10 PI %% program: E {printf("%lf\n", $1); } E : E'+'T {$$=$1+$3; } |E'-'T {$$=$1-$3; } |T {$$=$1; } ; T : T'*'F {$$=$1*$3; } |T'/'F {$$=$1/$3; } |F {$$=$1; } ; F : '('E')' {$$=$2; } |SQRT'('E')' {$$=sqrt($3); } |LOG10'('E')' {$$=log10($3); } |PI {$$=3.14159265; } |NUM {$$=$1; } |'-'F {$$=$2*(-1); } ; %% main(){ yyparse(); } yyerror(char* s){ fprintf(stderr, "%s\n", s); } lex %{ #include "j5_13y.h" %} D 0|1|2|3|4|5|6|7|8|9 DEZ 1|2|3|4|5|6|7|8|9 %% "+" {return *yytext; } "-" {return *yytext; } "*" {return *yytext; } "/" {return *yytext; } "(" {return *yytext; } ")" {return *yytext; } "sqrt" {return SQRT; } "log10" {return LOG10; } "PI" {return PI; } ({DEZ}{D}*|0)|({DEZ}{D}*|0).{D}* {yylval.num=atof(yytext); return NUM; } . {yyerror("invalid character"); exit(1); } %% int yywrap(){return 1; } コンパイルは通り、実行時エラーも出ません。 しかし、数式を入力してエンターキーを押すと、何も表示せず入力待ち状態が続き、ここでの入力は前の入力に連結されて処理されます。 (例)入力1.0+2.0(Enter)      ↓    改行して入力待ち状態      ↓    入力-log10(100.0)(Enter)      ↓    改行して入力待ち      ↓    入力+sqrt(4.0)(Enter)      ↓    改行して入力待ち      ↓    入力-2.0*PI(Enter)      ↓    改行して入力待ち      ↓    入力2.0-1.0      ↓    syntax error表示し終了 上記コードのどこが悪いのでしょうか。よろしくお願いします。

  • yaccとlexで、logや三角関数を含む電卓を作るプログラムの組み方

    今、yaccとlexで、logや三角関数を含む電卓を作るプログラムを作成しています。四則演算は実装できました。パイも実装できました。しかしlogや三角関数sin,cos,tanやabs,expなどがどうしても実装できません。以下のプログラムをlinux上のターミナルで実行しsin(90)やlog(90)どと入力しても、sintax errorと返されてしまいます。ちなみに実行時は-lmオプションは付けています。どうしたらこれらが実装できるのでしょうか。ご教授願えると幸いです。 ■yaccの.yファイル■ %{ #define YYSTYPE double #define PAICONST 3.14159265358979 #include <stdio.h> #include <math.h> double mcon=PAICONST/180.0; %} %token NL NUM LP RP END %left ADD SUB %left MUL DIV %left Pai Abs Sqrt Sin Cos Tan Log Exp NEG %% s : list ; list : /* empty */ | list expr NL { printf ("result: %lf\n", $2);} | list END { return;} ; expr : expr ADD expr {$$ = $1 + $3;} | expr SUB expr {$$ = $1 - $3;} | expr MUL expr {$$ = $1 * $3;} | expr DIV expr {$$ = $1 / $3;} | SUB expr %prec NEG {$$ = -$2;} | LP expr RP {$$ = $2;} | NUM {$$ = $1;} | Pai {$$=PAICONST;} | Abs "(" expr ")" {$$=abs($3);} | Sqrt "(" expr ")" {$$=sqrt($3);} | Sin "(" expr ")" {$$=sin($3*mcon);} | Cos "(" expr ")" {$$=cos($3*mcon);} | Tan "(" expr ")" {$$=tan($3*mcon);} | Log "(" expr ")" {$$=log($3);} | Exp "(" expr ")" {$$=exp($3);} ; %% yyerror(s) char *s; { printf ("%s\n",s);} main() { yyparse(); } #include "lex.yy.c" ■lexの.lファイル■ %{ #include <math.h> #include <ctype.h> %} %% "+" return (ADD); "-" return (SUB); "*" return (MUL); "/" return (DIV); "(" return (LP); ")" return (RP); "." return (END); (pai|PAI) return(Pai); (abs|ABS) return(Abs); (sqrt|SQRT) return(Sqrt); (sin|SIN) return(Sin); (cos|COS) return(Cos); (tan|TAN) return(Tan); (log|LOG) return(Log); (exp|EXP) return(Exp); [0-9]+\.[0-9]*|[0-9]+ { sscanf (yytext, "%lf", &yylval); return (NUM); } [ \t] ; ^\n return (END); \n return (NL); . return (yytext[0]); %%

  • エラーは出ませんが、実行結果ができません。

    このプログラムなんですが、エラーは出ませんが結果が 0群の項目1の正解率は0.000000です 1群の項目1の正解率は0.000000です 2群の項目1の正解率は0.000000です… この様になり、正解率がでません… 初心者で、わからないので困っています。 お願いします。 #include <stdio.h> #include <process.h> #define S 256 #define I 100 #define J 100 #define K 3 //グループの数 //#define M 50//サブコンテンツの数 void sum(int u[][J],int N,int n); void sort(int y[],int N,int u[][J],int n); void gunwake(int y[],int start,int N,int gunnum); void passege(int y[],int div[],int N,int num[],int u[][J],int n); static int y[I]; int div[K-1]; int divyouso=0; void main (void) { FILE *fp; int N=0,i=0,j=1,kou=0,n; //N:人数 n:問題数 static int u[I][J]; static int num[I]; char buf[S]; //ファイルオープン if ((fp=fopen("data_i2_1.csv","r"))==NULL){ printf("Can't open File\n"); exit(1); } // 問題数のカウント fgets(buf,S,fp); N+=1; while(buf[i]!='\n'){ kou=kou++; i+=1; } for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } n=kou/2+1; // レコードの読み込み while (fgets(buf,256,fp)!=NULL){ N+=1; // 文字型から数値型へ変換 j=1; for(i=0;i<=kou;i=i+2){ u[N][j]=buf[i]-'0'; j=j++; } } sum(u,N,n); gunwake(y,0,N,K); passege(y,div,N,num,u,n); fclose(fp); } void sum(int u[][J],int N,int n) { //static int y[I]; int i,ii; //学習者iの得点の初期化 for(i=0;i<=I;i++) y[i]=0; //学習者iの得点の計算 for(i=1;i<=N;i++){ for(ii=1;ii<=n;ii++){ y[i]+=u[i][ii]; } } sort(y,N,u,n); } void sort(int y[],int N,int u[][J],int n) { int left,right,i,shift,t,v; static int num[I]; //学習者の番号記憶用変数numの初期化 for(i=0;i<=I;i++) num[i]=0; for(i=1;i<=N;i++) num[i]=i; //シェーカーソート left=0; right=N; while (left<right){ for(i=left;i<right;i++){ if(y[i]>y[i+1]){ t=y[i]; v=num[i]; y[i]=y[i+1]; num[i]=num[i+1]; y[i+1]=t; num[i+1]=v; shift=i; } } right=shift; for(i=right;i>left;i--){ if(y[i]<y[i-1]){ t=y[i]; v=num[i]; y[i]=y[i-1]; num[i]=num[i-1]; y[i-1]=t; num[i-1]=v; shift=i; } } left=shift; } } void gunwake(int y[],int start,int N,int gunnum){ int tmp; int i,up,down,real; if(gunnum>1){ tmp=N/gunnum+start; //printf("tmp:%d\n",tmp); for(i=tmp;y[tmp]==y[i];i--){ } down = i + 1; //printf("down:%d\n",down); for(i=tmp;y[tmp]==y[i];i++){ } up =i; //printf("up:%d/n",up); if(tmp-down > up-tmp) real=up; else real=down; div[divyouso]=real; divyouso++; printf("%d\n",real); gunwake(y,real,N-real,gunnum-1); } } void passege(int y[],int div[],int N,int num[],int u[][J],int n){ int div2[K+1]; int k=0,j,i; int pp[I][J]; div2[0]=0; div2[K]=n; for(i=0;i<K-1;i++){ div2[i+1]=div[i]; } for(k=0;k<K;k++){ for(j=0;j<n;j++){ pp[k][j]=0; for(i=div2[k];i<div2[k+1];i++){ pp[k][j]=pp[k][j]+u[num[i]][j]; } } } //確認 putchar('\n'); for(j=1;j<=n;j++){ for(k=0;k<K;k++){ printf("%d群の項目%dの正解率は%fです\n",k,j,pp[k][j]); } } }

  • Prolog:リストに関する質問

    prefix(L1, L2):L1がL2のサブリストかどうか調べる述語を作ってるんですがサブリストに含まれているものしか判定できないまま悩み続けています。含まれていないものを入力すると無限ループに入ります。compoundを使ってみてもRedoでその行だけで無限ループに入ります。。。 なにか打開策はないでしょうか? /*---------------------無限ループ------------------------*/ [debug] ?- trace, prefix([c], [a, b, c]). Call: (8) prefix([c], [a, b, c]) ? creep Call: (9) prefix([c], [b, c]) ? creep Call: (10) prefix([c], [c]) ? creep Exit: (10) prefix([c], [c]) ? creep Exit: (9) prefix([c], [b, c]) ? creep Exit: (8) prefix([c], [a, b, c]) ? creep Yes [debug] ?- | . ERROR: Stream user_input:0:30 Syntax error: Unexpected end of clause [debug] ?- trace, prefix([g], [a, b, c]). Call: (8) prefix([g], [a, b, c]) ? creep Call: (9) prefix([g], [b, c]) ? creep Call: (10) prefix([g], [c]) ? creep Call: (11) prefix([g], []) ? creep Call: (12) prefix([g], []) ? creep Call: (13) prefix([g], []) ? creep Call: (14) prefix([g], []) ? creep Call: (15) prefix([g], []) ? creep Call: (16) prefix([g], []) ? creep Call: (17) prefix([g], []) ? /*-----------------Redo-----------------*/ ?- trace, prefix([g], [a, b, c]). Call: (9) prefix([g], [a, b, c]) ? cree Call: (10) compound([b, c]) ? creep Exit: (10) compound([b, c]) ? creep Call: (10) prefix([g], [b, c]) ? creep Call: (11) compound([c]) ? creep Exit: (11) compound([c]) ? creep Call: (11) prefix([g], [c]) ? creep Call: (12) compound([]) ? creep Fail: (12) compound([]) ? creep Redo: (11) prefix([g], [c]) ? creep Call: (12) prefix([g], [c]) ? creep Call: (13) compound([]) ? creep Fail: (13) compound([]) ? creep Redo: (12) prefix([g], [c]) ? creep Call: (13) prefix([g], [c]) ? creep Call: (14) compound([]) ? creep Fail: (14) compound([]) ? creep Redo: (13) prefix([g], [c]) ? creep Call: (14) prefix([g], [c]) ? creep Call: (15) compound([]) ? creep Fail: (15) compound([]) ? creep Redo: (14) prefix([g], [c]) ? creep Call: (15) prefix([g], [c]) ? creep Call: (16) compound([]) ? creep Fail: (16) compound([]) ? creep /*-------------ソース----------------*/ prefix([], _). prefix([X], [X|_]). prefix([X], [_|Y1]) :- prefix([X], Y1). prefix([X|Y], Y1) :- prefix([X], Y1), prefix(Y, Y1). /*-------------compound---------------*/ prefix([], _). prefix([X], [X|_]). prefix([X], [_|Y1]) :- compound(Y1), prefix([X], Y1). prefix([X|Y], Y1) :- prefix([X], Y1), prefix(Y, Y1).

  • マクロ初心者です 実行時エラー1004 の解決方法を教えてください

    マクロ初心者です 仕事で使っていたエクセルのマクロにエラーが出てしまいました。 「実行時エラー1004アプリケーション定義またはオブジェクト定義のエラーです。」 os:win2000 x = 0 y = 1 w_prv = "*" Do While rc.EOF = False If w_prv = "*" Or w_prv <> rc.Fields("種別名") Then If w_prv <> "*" Then NewSheet.Cells(y, x).FormulaR1C1 = "=SUM(RC[" & (2 - x) & "]:RC[-1])" End If y = y + 1 x = 2 End If If y = 2 Then NewSheet.Cells(1, x) = rc.Fields("所属名") End If If x = 2 Then NewSheet.Cells(y, 1) = rc.Fields("種別名") End If NewSheet.Cells(y, x) = rc.Fields("数量計") x = x + 1 w_prv = rc.Fields("種別名") rc.MoveNext Loop NewSheet.Cells(y, x).FormulaR1C1 = "=SUM(RC[" & (2 - x) & "]:RC[-1])" y = y + 1 For i = 2 To x NewSheet.Cells(y, i).FormulaR1C1 = "=SUM(R[" & (2 - y) & "]C:R[-1]C)" Next NewSheet.Cells(1, x) = "合計" NewSheet.Cells(y, 1) = "合計" rc.Close Call closeDB End Sub ************************************************** NewSheet.Cells(y, x).FormulaR1C1 = "=SUM(RC[" & (2 - x) & "]:RC[-1])" ↑ ここでエラーが出ているみたいです。 エクセルのマクロで入力したデータをアクセスに落としそこから新しいシートで月ごとの統計をとれるようになっていたのですが、とれなくなってしまいました。 こんな説明でお分かりになりますでしょうか? まったくの初心者なので… よろしくお願いいたします。

  • TextFieldParserで"含むファイルを

    c sharp、Visual Studio 2015でコーディングしています。 TextFieldParserでtsvを読み込みたいのですが、ケースにより エラーが出て困っています。 using (TextFieldParser parser = new TextFieldParser(filePath, Encoding.GetEncoding("utf-8"))) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters("\t"); //タブ区切り while (!parser.EndOfData) { // 1行読み込み string[] row = parser.ReadFields(); ←ここでエラーになる } } tsvファイルにダブルクォーテーションが含まれているとエラーになってしまうようです。 回避する方法はないでしょうか? tsvは以下のように記述されています。 "aaa bbb" 1 2 3 4