字句解析と構文解析の専門家のために...私は、さまざまな目的で IBM メインフレーム z/OS JCL を解析する一連のプログラムを perl で作成しようとしていますが、方法論の障害にぶつかっています。私は主に、Mark Jason Dominus による「Higher Order Perl」で提示された字句解析/構文解析のイデオロギーに従っていますが、どうすればよいかよくわからないことがいくつかあります。
JCL にはインライン データと呼ばれるものがあり、これは「ヒア」ドキュメントと非常によく似ています。これらをトークンに変換する方法がよくわかりません。
インライン データのレイアウトは次のとおりです。
//DDNAME DD *
this is the inline data
this is some more inline data
/*
...
通常、「DD」の後の「*」は、後続の行がインライン データ自体であり、「/*」または次の有効な JCL レコード (最初の 2 列が「//」で始まる) で終了することを意味します。
より高度なインライン データは、次のように表示されます。
//DDNAME DD *,DLM=ZZ
//THIS LOOKS LIKE JCL BUT IT'S ACTUALLY DATA
//MORE DATA MASQUERADING AS JCL
ZZ
...
インライン データ自体が JCL である場合もあります (おそらく、プログラムや内部リーダーなどに送り込まれるためです)。
しかし、ここに問題があります。JCL では、レコードは固定長の 80 バイトです。72 列目以降 (73 ~ 80 列目) はすべて「コメント」です。同様に、有効な JCL に続く空白の後に続くものはすべて、同様にコメントです。私は自分のプログラムで JCL を操作して吐き出そうとしているので、コメントを取り込んで保存できるようにしたいと考えています。
インライン データの場合のインライン コメントの例を次に示します。
//DDNAME DD *,DLM=ZZ THIS IS A COMMENT COL73DAT
data
...
ZZ
...more JCL
私は当初、最上位のレクサーで JCL の行を取得し、すぐに列 1 ~ 72 の非トークンを作成し、次に列 73 コメントのトークン (['COL73COMMENT',$1]) を作成できると考えていました。どれか。これにより、下流の次のイテレーター/トークナイザーに、列 1 から 72 のテキストの文字列とそれに続く col73 トークンが渡されます。
しかし、そこから下流でインライン データを取得するにはどうすればよいでしょうか。私は当初、最上位のトークナイザーが "DD \*(,DLM=(\S*))" (など) を探し、フィード イテレーターから区切り文字に到達するまでレコードを取得し続けることができると考えていました。または有効な JCL スターター (「//」)。
しかし、ここで問題が発生する可能性があります...最上位のトークナイザーを 2 つ持つことはできません...COL73 コメントを検索するトークナイザーが最上位にある必要があるか、インライン データを取得するトークナイザーが最上位にある必要があります。
perl パーサーにも同じ課題があると思います。
<<DELIM
必ずしも行末ではなく、その後にヒアドキュメントデータが続きます。結局のところ、perl は次のように表示されます。
my $this=$obj->ingest(<<DELIM)->reformat();
inline here document data
more data
DELIM
トークナイザー/パーサーは、「)->reformat();」をトークン化する方法をどのように認識しますか? それでも、次のレコードをそのまま取得しますか? インライン JCL データの場合、これらの行はそのまま渡されます。その場合、列 73 から 80 はコメントではありません...
それで、これに賛成する人はいますか?私のニーズを明確にするためにたくさんの質問があることは承知しており、必要なだけ明確にしていきます.
助けてくれてありがとう...