1

私は比較的単純なlex/flexファイルを持っており、それが適切にトークン化されていることを確認するために、flexのデバッグフラグを使用して実行しています。残念ながら、私は常に2つの問題のいずれかに遭遇しています-フレックスが生成するプログラムが2、3のトークンの後で静かに停止するか、文字と文字列を認識するために使用しているルールが呼び出されず、デフォルトのルール代わりに呼び出されます。

誰かが私を正しい方向に向けることができますか?フレックスファイルとサンプル入出力を添付しました。

編集:生成されたレクサーが特定のルール「cdr」の後に停止することがわかりました。これはより詳細ですが、はるかに混乱します。ショートした変更済みlexファイルを投稿しました。

/* lex file*/
%option noyywrap
%option nodefault

%{
       enum tokens{
                CDR,
                CHARACTER,
                SET
        };
%}

%%

"cdr"                                               { return CDR; }
"set"                                               { return SET; }

[ \t\r\n]                                           /*Nothing*/
[a-zA-Z0-9\\!@#$%^&*()\-_+=~`:;"'?<>,\.]      { return CHARACTER; }

%%

サンプル入力:

set c cdra + cdr b + () ;

生成されたパーサーを介して入力を実行することによる完全な出力:

--(end of buffer or a NUL)
--accepting rule at line 16 ("set")
--accepting rule at line 18 (" ")
--accepting rule at line 19 ("c")
--accepting rule at line 18 (" ")
--accepting rule at line 15 ("cdr")

何かご意見は?生成されたプログラムは、入力の半分の後であきらめています!(参考までに、ファイルの内容を生成されたプログラムにリダイレクトして入力を行っています)。

4

2 に答える 2

3

スタンドアロンのレクサー(つまり、bison / yaccで定義されたトークンを持つレクサーではない)を生成する場合、通常、トークンを定義するファイルの先頭に列挙型を書き込みます。ただし、メインを含むlexプログラムのメインループデフォルトで生成されるループは、次のようになります。

while( token = yylex() ){
    ...

これは、レクサーが列挙型の最初に表示されるルール(この特定の場合はCDR)と一致するまでは問題ありません。列挙型はデフォルトでゼロから始まるため、これによりwhileループが終了します。列挙型の番号を付け直すと、問題が解決します。

enum tokens{
            CDR = 1,
            CHARACTER,
            SET
    };

短いバージョン:レクサーのトークンを手動で定義する場合、0ではなく1から始めます。

于 2010-02-14T17:10:38.113 に答える
0

このルール

[-+]?([0-9*\.?[0-9]+|[0-9]+\.)([Ee][-+]?[0-9]+)? 
          |

最初の0-9の直後に閉じ括弧がないようです。|を追加しました。私がそうあるべきだと思う場所の下。フレックスがそれにどのように反応するかを推測し始めることができませんでした。

私が通常シンボル名に使用する規則は[a-zA-Z$_]、これは引用符で囲まれていない文字列に似ていますが、シンボルが数字で始まらない限り、通常はシンボル内に数字を許可する点が異なります。

[a-zA-Z$_]([a-zA-Z$_]|[0-9])*

文字は単なる短い記号です。独自のルールが必要だとは思いませんが、必要な場合は、文字列ルールに少なくとも2文字が必要であることを確認する必要があります。

[a-zA-Z$_]([a-zA-Z$_]|[0-9])+
于 2010-02-14T06:26:51.383 に答える