我正在研究通用代码解析器/荧光笔,一位用户报告说他遇到了AWK代码问题。
基本上,AWK将'/'字符定义为除法运算符和正则表达式分隔符“/../”。我想知道如何区分这两者。什么时候是'/'除法运算符?它什么时候表示正则表达式的开始?
大多数网站只会告诉你“''的含义取决于上下文”,但我想知道是否有一个简单的规则用于区分正斜杠的两种含义。
我从未使用过AWK,我对它的内部结构一无所知,我只是在寻找一种解析AWK代码的方法。那么,根据上下文解析'/'的逻辑是什么。如果您希望可以编写文本说明或进行代码(或伪代码)演示。虽然,我更喜欢不使用正则表达式的简单C代码。
答案 0 :(得分:2)
通常,//
文字正则表达式永远不会立即以文字或变量名称开头。它可能先于~
,!
和其他一些运算符。在某些情况下,//
隐含意味着$0 ~ //
。
/
除法运算符将始终以rvalue(变量,函数调用,文字,表达式)开头,/=
为特例。
请注意,awk
并不像C
那样慷慨,
printf("%i", 1
/2/3);
在awk中无效。但是这些 有效(ish)awk(使用gawk
和nawk
进行测试):
/a/+0/2 {print} # regex /a/
b /a/+0/2 {print} # not a regex (divide by zero)
## nawk will not accept anything after this line, gawk only
// {print} # empty regex, awk is not C99
/**/ {print } # dubious regex
/*/ { print "*/" } # awk is not C
{print //} # prints 1, equiv to ($0 ~ //)
/[/]/ { print } # tricky regex
如果你熟悉标记化和解析,这不是一个简单的任务,从这里开始:
(古代)awkgram.y
(包含在awkpretty
中)比gawk
更简单。
你可能比解析awkpretty
:
$ awklex '/a/+0/2 {print}'
# line 1 "/dev/stdin"
47 token 47 /
335 REGEXPR a
47 token 47 /
43 token 43 +
333 NUMBER 0
47 token 47 /
333 NUMBER 2
337 WHITESPACE
123 token 123 {
319 PRINT print
59 token 59 }
125 token 125 }
0 token 0
但这会限制您使用nawk
兼容语法。
(如果您需要编译awkpretty
,请注意使用旧的bison
,bison-1.35
适用于“YACC=bison-1.35 -y"
之前的configure
。” / p>
编辑: awklex
的输出似乎有点奇怪,令牌59为;
,最终的token 59
可能是隐含的终结符但它被}
歪曲了。
awkunlex.awk
中的注释暗示这是一个错误。
$ awklex '/a/+0/2 {print}' | gawk -f awkunlex.awk
/a/+0/2 {print}
答案 1 :(得分:1)
POSIX标准(http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html)说
In some contexts, a slash ( '/' ) that is used to surround an ERE could also
be the division operator. This shall be resolved in such a way that wherever
the division operator could appear, a slash is assumed to be the division
operator. (There is no unary division operator.)
请参阅“语法”部分http://pubs.opengroup.org/onlinepubs/009695399/utilities/awk.html#tag_04_06_13_16。
答案 2 :(得分:0)
我认为你必须研究“这是一个计算”。从中得到是/否,并采取适当的行动。正则表达式可以伪装成有效的算术吗?我可能错了,但无法想象它。