0

入力ファイル:
parameter1 abc
parameter2 123
parameter3 xyz
parameter2 の定義が必須で、ユーザーが定義を忘れた場合、yacc を使用して、この不足している変数について報告できますか?

4

2 に答える 2

1

私は自分のコメントを拡張し、適切な回答をしようとします。yacc は、構文解析、つまり、単語またはトークンの文法的配置の解析を行うためのツールです。yacc によって生成されたパーサーを使用して、次のようなトークンの文字列を有効なものとして認識します。

a = b + 2

そして、次のような文字列を無効として拒否します

2 b a = +

同じトークンが存在しますが、文法的でない順序が異なります。

代わりに、いくつかの単純な正規表現を使用する grep のような単純な文字列照合ツールが適しているようです。正規表現

/^parameter2/

文字列「parameter2」で始まる任意の行と、正規表現に一致します。

/^parameter[0-9]\s*[0-9]+$/

0 から 9 までの番号が付けられたパラメータ、いくつかの空白、および数字の文字列で構成される任意の行に一致します。行全体で一致する、大文字と小文字を区別しないで一致するなど、他のオプションがあります。


ここで、特定の問題に、パラメーターに割り当てられた値の型情報の検証が含まれている場合 (たとえば、parameter2文字列ではなく整数を使用する必要がある場合)、yacc が役立つ場合があります。しかし、私が書いたように、単純な問題のように見えるものをセットアップするには、多くの装置が必要だと思います。

于 2012-10-18T12:45:51.740 に答える
0

parameter2入力に ​​1 回だけ出現する必要があるという構文規則を作成できます。

valid_file: opt_param_list param2 opt_param_list
    ;

param2文法は、どこかを含むファイルのみを構文的に有効であると認識します。

ただし、あなたが求めているのは、構文チェックよりもセマンティック チェックです。おそらく、文法ではなくアクションでルールを実装する方がよいでしょう:

valid_file: opt_param_list
    {   if (param2_specified())
            YYACCEPT;
        else
        {
            err_report("No specification for parameter2");
            YYABORT;
        }
    }
    ;
于 2012-10-18T13:10:27.027 に答える