有没有AWK语法检查器?

时间:2011-08-23 17:34:34

标签: awk syntax-checking

是否有任何AWK语法检查程序?我对只有标记语法错误的最小检查器和沿着lint行的更广泛的检查器感兴趣。

它应该只是一个静态检查程序,不依赖于运行脚本。

3 个答案:

答案 0 :(得分:8)

如果您在Awk脚本前加BEGIN { exit(0) } END { exit(0) }前缀,则可以保证您的所有代码都不会运行。在BEGINEND期间退出会阻止其他开始和退出块运行。如果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

更新:BEGINEND

尽管END { exit(0) }块似乎是多余的,但要比较这三个调用之间的细微差别:

$ 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期间退出是阻止所有其他事件块运行的唯一方法;这就是上面第三次调用显示没有执行print语句的原因。 GNU Awk用户指南有一节exit statement

答案 1 :(得分:2)

GNU awk似乎有--lint option

答案 2 :(得分:1)

对于在第一个错误处停止的最小语法检查程序,请尝试awk -f prog < /dev/null