入力ファイル:
parameter1 abc
parameter2 123
parameter3 xyz
parameter2 の定義が必須で、ユーザーが定義を忘れた場合、yacc を使用して、この不足している変数について報告できますか?
2 に答える
私は自分のコメントを拡張し、適切な回答をしようとします。yacc は、構文解析、つまり、単語またはトークンの文法的配置の解析を行うためのツールです。yacc によって生成されたパーサーを使用して、次のようなトークンの文字列を有効なものとして認識します。
a = b + 2
そして、次のような文字列を無効として拒否します
2 b a = +
同じトークンが存在しますが、文法的でない順序が異なります。
代わりに、いくつかの単純な正規表現を使用する grep のような単純な文字列照合ツールが適しているようです。正規表現
/^parameter2/
文字列「parameter2」で始まる任意の行と、正規表現に一致します。
/^parameter[0-9]\s*[0-9]+$/
0 から 9 までの番号が付けられたパラメータ、いくつかの空白、および数字の文字列で構成される任意の行に一致します。行全体で一致する、大文字と小文字を区別しないで一致するなど、他のオプションがあります。
ここで、特定の問題に、パラメーターに割り当てられた値の型情報の検証が含まれている場合 (たとえば、parameter2
文字列ではなく整数を使用する必要がある場合)、yacc が役立つ場合があります。しかし、私が書いたように、単純な問題のように見えるものをセットアップするには、多くの装置が必要だと思います。
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;
}
}
;