2

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

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

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

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

4

3 回答 3

3

通常,//文字正则表达式永远不会紧跟在文字或变量名之前。前面可能有~,!和其他一些运算符。在某些情况下//隐含的意思是$0 ~ //

/除法运算符之前总是有一个右值(变量、函数调用、文字、表达式),作为/=一种特殊情况。

请注意,awk对空格的处理不如C,

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

在 awk 中无效。然而,这些有效的(ish)awk(用gawkand测试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's 更简单。

您可能比解析以下输出做得更糟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"before configure。)

编辑:的输出似乎有点奇怪awklex,标记 59 是;,最后token 59可能是一个隐含的终止符,但它被歪曲为}. 中的注释awkunlex.awk意味着它是一个错误。

$ awklex  '/a/+0/2 {print}' | gawk -f awkunlex.awk 
/a/+0/2 {print}
于 2013-02-06T16:10:25.763 回答
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 。

于 2013-02-06T14:34:28.523 回答
0

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

于 2013-02-06T12:10:00.030 回答