AWK代码解析器,区分正则表达式

时间:2013-02-06 08:56:07

标签: regex parsing awk division

我正在研究通用代码解析器/荧光笔,一位用户报告说他遇到了AWK代码问题。

基本上,AWK将'/'字符定义为除法运算符和正则表达式分隔符“/../”。我想知道如何区分这两者。什么时候是'/'除法运算符?它什么时候表示正则表达式的开始?

大多数网站只会告诉你“''的含义取决于上下文”,但我想知道是否有一个简单的规则用于区分正斜杠的两种含义。

我从未使用过AWK,我对它的内部结构一无所知,我只是在寻找一种解析AWK代码的方法。那么,根据上下文解析'/'的逻辑是什么。如果您希望可以编写文本说明或进行代码(或伪代码)演示。虽然,我更喜欢不使用正则表达式的简单C代码。

3 个答案:

答案 0 :(得分:2)

通常,//文字正则表达式永远不会立即以文字或变量名称开头。它可能先于~!和其他一些运算符。在某些情况下,//隐含意味着$0 ~ //

/除法运算符将始终以rvalue(变量,函数调用,文字,表达式)开头,/=为特例。

请注意,awk并不像C那样慷慨,

printf("%i", 1
/2/3);

在awk中无效。但是这些 有效(ish)awk(使用gawknawk进行测试):

/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,请注意使用旧的bisonbison-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)

我认为你必须研究“这是一个计算”。从中得到是/否,并采取适当的行动。正则表达式可以伪装成有效的算术吗?我可能错了,但无法想象它。