gpt4 book ai didi

awk - 是否有任何 AWK 语法检查器?

转载 作者:行者123 更新时间:2023-12-04 13:43:23 24 4
gpt4 key购买 nike

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

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

最佳答案

如果你用 BEGIN { exit(0) } END { exit(0) } 作为 Awk 脚本的前缀,您可以保证您的任何代码都不会运行。期间退出 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是阻止所有其他事件块运行的唯一方法;这就是为什么上面的第三次调用显示没有执行打印语句的原因。 GNU Awk 用户指南中有一个部分是关于 exit statement .

关于awk - 是否有任何 AWK 语法检查器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7165167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com