2012-02-26 11 views
0

テキストファイル内のトークンの長さを返す字句アナライザを作成しようとしています。プログラムがYYText()またはYYLeng()を返さないのはなぜですか?

テキストファイルに「a」という文字が1つあります。次

%option noyywrap 
%{ 
%} 

/* regular definitions */ 
delim   [ \t\n] 
ws    {delim}+ 
letter   [A-Za-z] 
digit   [0-9] 

%% 

{ws}   {/* no action */} 
letter   {return 1;} 

%% 

次はYYText()とYYLeng()関数を使用するメインプログラムファイルである私のlex.lファイルです。

#include <stdio.h> 
#include <stdlib.h> 
#include "lex.yy.cc" 

using namespace std; 

int OpenInputOutput(int argc, char *argv[], ifstream & lexerFIn, ofstream & lexerFOut) 
{ 
// open input 
if (argc > 1) { 
    lexerFIn.open(argv[1]); 
    if (lexerFIn.fail()) { 
     cerr << "Input file cannot be opened\n"; 
     return 0; 
     } 
    } 
else { 
cerr << "Input file not specified\n"; 
return 0; 
} 

// open output 
lexerFOut.open("Output.txt"); 
if (lexerFOut.fail()) { 
    cerr << "Output file cannot be opened\n"; 
    return 0; 
} 
} 

int main(int argc, char *argv[]) 
{ 
yyFlexLexer lexer; 
while (lexer.yylex() != 0) { 
    cout << lexer.YYText() << endl; 
    cout << lexer.YYLeng() << endl; 
} 
return 0; 
} 

私は、コマンド./a「sample.txtの」と、前述したテキストファイルを使用してプログラムを実行

が、それは「」ファイルに書き込みます。なぜそれはYYText()またはYYLeng()を出力しないか、または出力ファイルに文字の長さを書きませんか?

+0

コードのどこにも、コマンドライン引数としてファイル名を使用しません。それはあなたがそれを渡した "sample.txt"を無視します。 –

+0

なぜあなたはプログラムのどこでも開いたことのないファイルから 'a'と1を返すべきですか? – ssube

+0

私は質問を更新しました。 – idealistikz

答えて

1

パーサーがトークンと一致した後でのみ、YYTextまたはYYLengに電話をかけることができます。何かを解析する前にそれらを呼び出すことはできません。あなたは決して起こらなかった試合の特性を取り戻しています。

errnoの値をランダムに取得した場合と同じ問題です。

+0

パーサーにトークンを一致させるにはどうすればよいですか? – idealistikz

+0

パーサの 'yylex'メソッドを、通常は' while'ループで呼び出します。 –

+0

lexer.yylex()を呼び出すと、プログラムは何も出力しません。適切な構文は何ですか? – idealistikz

0

yylex()機能は、別の方法で動作させる場合を除き、標準入力から読み込みます。それで、あなたは文字か白い空白をタイプするのを待っています。

+0

文字または空白を入力すると、入力した内容が返されます。なぜ私はcout << lexer.YYLeng()を入力したので、トークンの長さを返さないのですか? – idealistikz

+0

わかりません。エコーが入力されたとき、私は他のマテリアルでそれを囲むので、実際に何があるのか​​分かります。 'cout <<" Text:<< "<< lexer.YYText << ">>(長さ:" << lexer.YYLeng()<< ")" << "endl;'これは、例えば、空文字列が印刷されていることを示しているのですが、端末によるエコーとプログラムによるエコーとの間にも曖昧さがあります –

+0

ちょっと実験したところ、クラス内で 'yyFlexLexer'が指定されていますが、' main() 'でループの本体に戻ってこないことがわかります。 –

0

yylex()は、return VALUE;またはEOFのアクションに対してのみ返します。 cout << lexer.YYText() << endl; & Co.は、入力letterに対してのみ実行されます。

出力コードをスキャナの動作に移動するか、またはすべての操作でreturn VALUE;に移動する必要があります。注:後者の場合、yytext/yylenの値がyylex()の呼び出し元に返された後に存在することが保証され、意味があるかどうかはわかりません。

関連する問題