2

私は一般的なコード パーサー/ハイライターに取り組んでおり、あるユーザーが AWK コードに問題があると報告しました。

基本的に、AWK は「/」文字を除算演算子および正規表現区切り文字「/../」として定義します。両者の見分け方を教えていただきたいです。「/」除算演算子はいつで、いつ正規表現の開始を表しますか?

ほとんどの Web サイトでは、「'/' の意味はコンテキストに依存する」とだけ説明されていますが、スラッシュの 2 つの意味を区別するために使用される簡単な規則があることを知りたいです。

私は AWK を使用したことがなく、その内部についても何も知りません。AWK コードを解析する方法を探しているだけです。したがって、コンテキストに応じて「/」を解析するロジックは何でしょうか。必要に応じて、テキストによる説明を書いたり、コード (または疑似コード) のデモを作成したりできます。ただし、正規表現を使用しない単純な C コードを好むでしょう。

4

3 に答える 3

3

一般に、//リテラル正規表現の直前にリテラルまたは変数名が続くことはありません。~!およびその他の演算子が先行する場合があります。場合によって//は暗黙のうちに を意味し$0 ~ //ます。

特殊なケースとして、除算演算子の/前には常に右辺値 (変数、関数呼び出し、リテラル、式) が付きます。/=

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

トークン化と解析に精通している場合は、ここから始めてください。

(ancient) 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(古い を使用するように注意してコンパイルする必要がある場合は、 " beforebisonで動作します。)bison-1.35YACC=bison-1.35 -y"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 に答える