8

AWK 構文チェッカーはありますか? 私は、構文エラーにフラグを立てるだけの最小限のチェッカーと、lint の行に沿ったより広範なチェッカーの両方に興味があります。

スクリプトの実行に依存せず、静的チェッカーのみである必要があります。

4

3 に答える 3

10

Awk スクリプトの前に を付けるとBEGIN { exit(0) } END { exit(0) }、どのコードも実行されないことが保証されます。中に終了BEGINするとEND、他の開始ブロックと終了ブロックが実行されなくなります。Awk が 0 を返す場合、スクリプトは正常です。それ以外の場合は、構文エラーがありました。

コード スニペットを別の引数に入れると、エラー メッセージに適切な行番号が表示されます。この召喚…

gawk --source 'BEGIN { exit(0) } END { exit(0) }' --file syntax-test.awk

次のようなエラー メッセージが表示されます。

gawk: syntax-test.awk:3:   x = f(
gawk: syntax-test.awk:3:         ^ unexpected newline or end of string

GNU Awk--lintは、グローバル変数や未定義関数などを検出できます。

gawk: syntax-test.awk:5: warning: function `g': parameter `x' shadows global variable
gawk: warning: function `f' called but never defined

また、GNU Awk の--posixオプションは、いくつかの互換性の問題を見つけることができます。

gawk: syntax-test.awk:2: error: `delete array' is a gawk extension

更新:BEGINおよびEND

ブロックは冗長に見えますがEND { exit(0) }、これら 3 つの呼び出しの微妙な違いを比較してください。

$ echo | awk '
  BEGIN { print("at begin") }
  /.*/ { print("found match") }
  END { print("at end") }'
at begin
found match
at end

$ echo | awk '
  BEGIN { exit(0) }
  BEGIN { print("at begin") }
  /.*/ { print("found match") }
  END { print("at end") }'
at end

$ echo | awk '
  BEGIN { exit(0) } END { exit(0) }
  BEGIN { print("at begin") }
  /.*/ { print("found match") }
  END { print("at end") }'

Awk では、途中で終了BEGINすると、他のすべての開始ブロックがキャンセルされ、入力との一致が防止されます。途中で終了ENDすることが、他のすべてのイベント ブロックの実行を防ぐ唯一の方法です。そのため、上記の 3 番目の呼び出しでは、print ステートメントが実行されていないことが示されています。GNU Awk User's Guide には、exitステートメントに関するセクションがあります。

于 2011-08-27T03:11:05.850 に答える
2

GNU awk には--lintオプションがあるようです。

于 2011-08-23T18:13:02.180 に答える