JP2014211729A - 計算機、プログラム及びデータ生成方法 - Google Patents

計算機、プログラム及びデータ生成方法 Download PDF

Info

Publication number
JP2014211729A
JP2014211729A JP2013087042A JP2013087042A JP2014211729A JP 2014211729 A JP2014211729 A JP 2014211729A JP 2013087042 A JP2013087042 A JP 2013087042A JP 2013087042 A JP2013087042 A JP 2013087042A JP 2014211729 A JP2014211729 A JP 2014211729A
Authority
JP
Japan
Prior art keywords
syntax
token
character string
tree
syntax tree
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2013087042A
Other languages
English (en)
Other versions
JP5932707B2 (ja
Inventor
美里 吉田
Misato Yoshida
美里 吉田
敬子 本川
Keiko Motokawa
敬子 本川
博泰 西山
Hiroyasu Nishiyama
博泰 西山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2013087042A priority Critical patent/JP5932707B2/ja
Publication of JP2014211729A publication Critical patent/JP2014211729A/ja
Application granted granted Critical
Publication of JP5932707B2 publication Critical patent/JP5932707B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Devices For Executing Special Programs (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)

Abstract

【課題】ソースプログラムの構文解析で利用する種々の定義を構文解析器の外部から与え、解析対象の構文や解析粒度を容易に変更可能にする。
【解決手段】
ソースプログラムからソースプログラムの構造を表す木構造データを生成する計算機であって、構文要素に対応する文字列候補を外部ファイルとして格納する記憶部と、文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行する制御部と、を有する計算機である。
【選択図】 図5

Description

本発明は、計算機、プログラム及びデータ生成方法に係り、特に、解析対象の構文や解析粒度の変更に対応するための計算機、プログラム及びデータ生成方法に関する。
一般に、ソースプログラムを解析してプログラムの構造に関する情報を出力する処理系や、ソースプログラムをオブジェクトコードに変換する処理系では、入力された文字列から構文の構造を把握する、字句解析、構文解析のステップを含む。これらを実施するプログラムをそれぞれ、字句解析器、構文解析器と呼ぶ。構文解析の結果は、構文の構造を木構造で表現した構文木として残すことが多い。非特許文献1の19頁〜30頁には、字句解析、構文解析及び構文木の例が開示されている。
従来の、字句解析、構文解析の処理の概要を説明する。以降の説明では、ソースプログラムのイメージをCOBOLで説明しているが、他のプログラミング言語でも同様である。
図13に、従来の、字句解析、構文解析の処理の流れを模式的に示す。字句解析器107は、ソースプログラム112を入力として、ソースプログラム112中の文字列を構文要素 (トークン)に分ける。例えば、入力するソースプログラム112を図14の1300とした場合、図15の1400が表すようなトークンの列を生成する。これは、文字列「「M」「O」「V」「E」」が入力された場合は、「MOVE」で一つのトークンを表す等トークンの定義が、字句解析器107に与えられていることから実現できるものである。
構文解析器108は、字句解析器107が生成したトークンの列110を入力として、その言語の組み立て方である構文に従って解析を行い、構文木111を生成する。例えば、入力するトークンの列が、図15の1400である場合、図16Aに示す構文木例1501のような構文木を生成する。構文木例1501では、「「MOVE」「A」「OF」「B」「TO」「C」「OF」「D」」を「STMT」ノードで束ね、1つの文であることを表現している。これは、構文解析器108内で、トークン列のパターンが「「MOVE」「名前」「TO」「名前」」である場合、文として認識し「STMT」ノードで束ねる等、構文の定義及び木構造の定義がされているため実現可能となっている。
プログラミング言語は、言語仕様書などによりその定義が決まっている。その定義に基づき、字句解析器及び構文解析器を作成すれば、言語仕様書の定義に沿ったソースプログラムに対して、解析が可能になる。
バージョンアップ等で言語仕様に変化が生じた場合や独自言語仕様が含まれているソースプログラムを入力する場合には、例え同種のプログラミング言語で記述されたソースプログラムであっても解析することが不可能になることが少なくない。このような場合、これらソースプログラムも解析ができるようにする為に、字句解析器や構文解析器に構文の定義を追加することが行われている。
プログラミング言語の言語仕様は一定である場合でも、解析のニーズにより、必要な構文木の形状が異なる場合がある。例えば、図14に示すようなソースプログラム例1300を入力とし構文木を作成する際、文の区別を行うレベルの解析で十分な場合は、図16Aの構文木例1501のように、文を表すトークン列をフラットな構造として持ち、それをSTMTノードで束ねた構文木を作成すればよい。
また、IDの区別を行うレベルの解析が必要な場合は、上記ではフラットな構造になっていたトークン列に対して、図16Bの構文木例1502のように、IDを表すトークン列をIDノードで束ねた構文木が必要になる。更に、IDのRead/Writeの区別を行うレベルの解析が必要な場面では、図16Cの構文木例1503のように、上記IDノードにRead/Writeの属性をつけた構文木が必要である。
このような場合、解析のニーズに合わせ、上記構文木を生成する構文解析器を開発する必要がある。一般には、解析結果を利用するアプリケーションの目的に応じて、解析のニーズが決定される。例えば、オブジェクトプログラムの実行性能を重視した最適化コンパイラでは、通常、種々の最適化を実施することから構造の詳細な把握が必要であり、詳細な解析を行う構文解析器を利用する。
佐々政孝、"プログラミング言語処理系 "、岩波書店、1989年(特に、19頁〜30頁)
プログラミング言語の仕様や、解析のニーズに合わせ、字句解析器や構文解析器をその都度開発すると、構文解析器の修正箇所を探すために事前知識が必要となることや、解析のニーズ毎に作り直すと工数がかかる等の問題が生ずる。更に、解析器のユーザとしては、解析のニーズに合った構文解析器を入手し直さなければいけないという問題もある。
このような課題を解決する為に、例えば、特許請求の範囲に記載の発明を適用する。即ちソースプログラムからコンピュータが実行可能なデータを生成する計算機であって、構文要素に対応する文字列候補を外部ファイルとして格納する記憶部と、文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行する制御部と、を有する計算機である。
本発明の一側面によれば、ソースプログラムの構文解析で利用する種々の定義に柔軟に対応できると共に解析対象の構文や解析粒度の変更に容易に対応可能となる。
本発明の他の課題及び効果は、以下の記載から明らかになる。
本発明を適用した一実施形態である計算機の処理概要を示す模式図である。 本実施形態の計算機の構成例を示した模式図である。 本実施形態のトークン定義の例を示す模式図である。 本実施形態のトークン読み飛ばし規則の例を示す模式図である。 本実施形態の計算機における全体処理の流れ示すフロー図である。 本実施形態におけるカスタマイズしたトークン定義利用を含む字句解析処理の流れを示すフロー図である。 本実施形態におけるトークン読み飛ばし規則利用を含む基本構文解析処理例の流れを示すフロー図である。 本実施形態におけるトークン読み飛ばし規則に基づく部分木作成と構文木への追加処理例の流れを示すフロー図である。 本実施形態におけるトークン読み飛ばし規則に基づく部分木作成と構文木への追加処理で用いるソースプログラムの例を示す模式図である。 本実施形態におけるトークン読み飛ばし規則に基づく部分木作成と構文木への追加処理実施後の構文木の例を示す模式図である。 本実施形態における構文木訪問器追加処理例の流れを示すフロー図である。 本実施形態を適用しない場合に、誤って生成された構文木の例を示す模式図である。 従来技術における構文解析処理の概要を示す模式図である。 従来技術における構文解析処理で用いるソースプログラムの例を示す図である。 従来技術における構文解析処理で用いるトークン列の例を示す図である。 従来技術における構文解析処理実施後の構文木例を示す模式図である。 従来技術における構文解析処理実施後の構文木例を示す模式図である。 従来技術における構文解析処理実施後の構文木例を示す模式図である。
以下、図面を用いて本発明を実施するための形態を詳細に説明する。
図1に、本発明を適用した一例である計算機100での構文解析の概要を模式的に示す。
計算機100の字句解析器107は、ソースプログラム112とトークン定義113を入力としてトークン列110を出力する。図3に示すように、トークン定義113は、トークン種別301と文字列キーワード302から成る。
字句解析器107は、入力したソースプログラム中の文字列が、文字列キーワード302と合致した場合、その文字列キーワード302が属しているトークン種別301が示すトークンとして出力する。例えば、図3のトークン定義113を利用する場合、ソースプログラム中に「MOVE」という文字列があったならば、これをトークン「STMT_HEAD」として出力する。出力されたトークン「STMT_HEAD」には、合致した入力文字列が「MOVE」であるという情報も保持するものとする。合致した入力文字列の情報をトークンが保持するのは、本実施形態に関わらず一般的な仮定である。この「MOVE」を、トークン「STMT_HEAD」のテキストと呼ぶ。なお、本実施形態において、トークン定義113はユーザがカスタマイズ可能である。
構文解析器108は、トークン読み飛ばし規則114と字句解析器107が出力したトークン列110を入力として、構文木111を出力する。構文解析器108は、入力されたトークン列110が構文規則に合致する場合、それに応じた部分木作成及び構文木への追加を実行する。入力されたトークン列110が構文規則に合致しない場合、トークン読み飛ばし規則114に基づき構文要素を読み進め、部分木作成と構文木への追加を実行する。
トークン読み飛ばし規則114は、図4に示すように、開始401、終了402及び終了トークン読み込み403を対応付けて構成されている。開始401には、読み飛ばし対象の開始トークン又はトークンのテキストが登録される。終了402には、読み飛ばし対象の終了トークン又はトークンのテキストが登録される。終了トークン読み込み403には、読み飛ばしを行う際、終了402に登録されているトークンの手前まで読むのか、終了402に登録されているトークンを含めて読むのかを示す情報が登録される。例えば、終了402に登録されているトークンを含めて読む場合には、「TRUE」が登録され、終了402に登録されているトークンの手前まで読む場合には、「FALSE」が登録されるようになっている。なお、トークン読み飛ばし規則114は、ユーザがカスタマイズ可能である。
構文木訪問器109は、構文解析器108が出力した構文木111を入力として、構文木の構造の変換を行い、変換後の構文木111を出力する。これは、構文解析器108が生成した構文木111に対して、解析粒度を変更したい場合等に行う処理である。なお、構文木訪問器109はユーザがカスタマイズ可能である。
以上が、計算機100における構文解析の概要説明である。
図2に、計算機100の構成を模式的に示す。計算機100は、汎用のサーバ装置等であり、CPU101、主記憶装置104、HDDやSSD等から構成される補助記憶としての外部記憶装置105、ディスプレイ等の出力装置102及びキーボード、マウス並びにタッチパネル等の入力装置103を備える。入力装置103を介して、ユーザからの構文解析開始命令を受け付け、構文解析結果、構文解析終了メッセージやエラーメッセージが、出力装置102に出力されるようになっている。
主記憶装置104には、プログラムとCPU101との協働により、解析器106及び解析器106の解析過程で必要になるトークン列110及び構文木111が格納される。解析器106は、字句解析器107、構文解析器108及び構文木訪問器109から構成される。
外部記憶装置105には、ソースプログラム112、トークン定義113、トークン読み飛ばし規則114及び構文木変換条件115が格納される。計算機100では、入力装置103等を介して、これらの定義、規則、変換条件の改変や追加が可能になっている。より詳細には、入力された改変や追加部分に関して外部ファイルとして保持し、解析器106による処理において、この外部ファイルも参照するようになっている。
なお、本実施形態では入力装置130としてキーボートやマウスといったユーザインタフェースを適用する例とするが、本発明はこれに限定されるものではなく、インターネット等のネットワークを介した入力手段や、可搬性の記録媒体を介して外部ファイルへの更新入力を行う等、種々の方式を用いることができる。
次いで、計算機100の処理の流れを詳細に説明する。
図5に、構文解析処理の全体の流れを示す。
S501で、解析器106は、カスタマイズしたトークン定義113の利用を含む字句解析を行う。本処理は、解析器106内の字句解析器107が実施する処理であり、詳細については後述する。
S502で、解析器106は、トークン読み飛ばし規則114の利用を含む基本構文解析を行う。本処理は、解析器106内の構文解析器108が実施する処理であり、詳細については後述する。
S503で、解析器106は、未処理の構文木訪問器109があるか否かを判定し、未処理の構文木訪問器109がある場合(S503:Yes)、S504に進む。未処理の構文木訪問器109がない場合(S503:No)、本処理を終了する。
S504で、解析器106は、構文木訪問と変換処理を行う。本処理は、解析器106内の構文木訪問器109が実施する処理であり、種々の公知の方法を利用できる。詳細は、例を用いて後述する。
以上が、計算機100の構文解析の全体処理の流れの説明である。
以降では、上述の構文解析処理(図5)の各ステップの詳細処理を説明する。
まず、図6を用いて、「カスタマイズしたトークン定義利用を含む字句解析(図5のS501)」の処理について説明する。
S601で、字句解析器107は、未処理の文字列があるか否かを判定し、未処理の文字列がある場合(S601:Yes)、S602に進む。未処理の文字列がない場合(S601:No)、本処理を終了する。
S602で、字句解析器107は、先頭文字の読み込みとトークンの予測を行う。例えば、先頭文字が英字から始まっている場合と、数値から始まっている場合では、異なるトークンの予測を行う。先頭文字から判断がつかない場合は、複数文字の読み込みを行って判断を行う。本処理については種々の公知の方法を利用できる。
S603で、字句解析器107は、トークンのマッチング処理及び消費文字の保存を行う。本処理では、入力された文字列を1文字ずつ読み進め、S602で予測したトークンの規則に合致しているかを調べる。また、読み進めた文字列はS604の判定で使用するため保存している。
S604で、字句解析器107は、マッチしたトークンに変換条件があるか否かを判定し、変換条件がある場合(S604:Yes)、S605に進む。変換条件がない場合(S604:No)、S607に進み、S603でマッチしたトークンを入力文字列のトークンとして決定する。
S605で、字句解析器107は、トークン変換条件を満たすか否かを判定する。本実施形態では、S603で保存した文字列が、ユーザが定義したトークン定義113の文字列キーワード302に含まれることをトークン変換条件としている。トークン変換条件を満たす場合(S605:Yes)、S606に進む。トークン変換条件を満たさない場合(S605:No)、S607に進み、S603でマッチしたトークンを入力文字列のトークンとして決定する。
S606で、字句解析器107は、トークン定義113に基づくトークンの変換を行う。具体的には、S603で保存した文字列と合致する文字列キーワード302が属している、トークン種別301が示すトークンへの変換を行う。その後、S607で、本変換後のトークンを入力文字列のトークンとして決定する。
以上の処理を、未処理の文字列がなくなるまで実施する。
ここで、この処理の具体例を示す。入力文字列例として(1)「TEST」、(2)「MOVE」を用いた場合を夫々説明する。また、前提として、字句解析器107内に、英字の文字列は「STRING」というトークンにマッチさせる規則があるものとし、「STRING」にマッチした後のトークン変換条件として、「トークン定義113の文字列キーワード302に文字列が含まれるか否か」があるとする。なお、本前提は例を説明するためのものであり、必ずしも本発明の実現に同じ前提が必要であるわけではない。
まず、文字列「TEST」が入力された場合の処理の流れを説明する。
S601で、字句解析器107は、未処理の文字列「TEST」があるため(S601:Yes)、S602に進む。
S602で、字句解析器107は、先頭文字「T」を読み込み、これは英字であるため、マッチするトークンは「STRING」であると判定する。
S603で、字句解析器107は、入力された文字列「TEST」を1文字ずつ読み進め、「TEST」がトークン「STRING」の規則に合致していることを確認する。また、読み進めた文字列「TEST」を保存しておく。
S604で、字句解析器107は、マッチしたトークン「STRING」に変換条件があるため(S604:Yes)、S605に進む。
S605で、字句解析器107は、トークン変換条件を満たすか否かを判定する。即ち、「TEST」がトークン定義113の文字列キーワード302に含まれるか否かを判定する。「TEST」は、トークン定義113の文字列キーワード302に含まれないため(S605:No)、S607へ進み、入力文字列「TEST」のトークンを、「STRING」と決定する。
もう一方の例として、文字列「MOVE」が入力された場合の処理の流れを説明する。
S601で、字句解析器107は、未処理の文字列「MOVE」があるため(S601:Yes)、S602に進む。
S602で、字句解析器107は、先頭文字「M」を読み込み、これは英字であるため、マッチするトークンは「STRING」であると予測する。
S603で、字句解析器107は、入力された文字列「MOVE」を1文字ずつ読み進め、「MOVE」がトークン「STRING」の規則に合致していることを確認する。また、読み進めた文字列「MOVE」を保存しておく。
S604で、字句解析器107は、マッチしたトークン「STRING」に変換条件があるため(S604:Yes)、S605に進む。
S605で、字句解析器107は、トークン変換条件を満たすか否かを判定する。即ち、「MOVE」がトークン定義113の文字列キーワード302に含まれるか否かを判定する。「MOVE」は、トークン定義113の文字列キーワード302に含まれるため(S605:Yes)、S606に進む。
S606で、字句解析器107は、トークン定義113において「MOVE」が属しているトークン種別301は「STMT_HEAD」であるため、トークンを「STMT_HEAD」に変換する。
S607で、S606で変換後の「STMT_HEAD」を入力文字列「MOVE」のトークンとして決定する。
以上が、「カスタマイズしたトークン定義利用を含む字句解析(図5のS501)」の補足説明である。
次いで、図7を用いて、「トークン読み飛ばし規則利用を含む基本構文解析(図5のS502)」について説明する。
S701で、構文解析器108は、未処理のトークンがあるか否かを判定し、未処理のトークンがある場合(S701:Yes)、S702に進む。未処理のトークンがない場合(S701:No)、本処理を終了する。
S702で、構文解析器108は、先頭トークンの読み込みと構文の予測を行う。例えば、先頭トークンが「IF」の場合、構文は「IF文」であると予測できる。先頭トークンから判断がつかない場合は、複数トークンの読み込みを行って判断を行う。
S703で、構文解析器108は、該当構文があるか否かを判定し、該当構文がある場合(S703:Yes)、S704に進む。該当構文がない場合(S703:No)、S708に進む。
S704で、構文解析器108は、入力トークン列が構文規則に合致しているか否かを調べる。これをマッチングと呼ぶ。
S705で、構文解析器108は、S704でのマッチングに成功したか否かを判定し、
マッチングに成功した場合(S705:Yes)、S706に進み、マッチした構文の部分木作成と構文木111への追加を行う。S706の処理については、種々の公知の方法を利用できる。一方、マッチングに失敗した場合(S705:No)、S707に進む。
S707で、構文解析器108は、マッチさせようとしていた先頭トークンまで解析対象の位置を戻す。
S708で、構文解析器108は、トークン読み飛ばし規則114に基づく部分木作成と構文木111への追加を行う。本処理については後述する。
以上の処理を、未処理のトークンがなくなるまで実施する。
図8に、上述の「トークン読み飛ばし規則に基づく部分木作成と構文木への追加(図7のS708)」の詳細な処理の流れを説明する。
S801で、構文解析器108は、先頭トークンのテキストがトークン読み飛ばし規則114の開始401に登録されているか否かを判定し、開始401に登録されている場合(S801:Yes)、S802に進む。開始401に登録されていない場合(S801:No)、S803に進む。
S802で、構文解析器108は、トークンを読み進め、トークン読み飛ばし規則114の終了402に登録されているトークンを発見した場合(S802:Yes)、S804に進む。終了402に登録されているトークンを発見できなかった場合(S802:No)、S803に進む。
S803で、構文解析器108は、トークン読み飛ばし規則114のデフォルトの終了402に登録されているトークンの手前まで読み進める。なお、S802及びS803において、トークン読み飛ばし規則114の終了402に複数のトークンがエントリされている場合、いずれかのトークンを発見できれば良い。
S804で、構文解析器108は、トークン読み飛ばし規則114の終了トークン読み込み403に「TRUE」が登録されているか否かを判定し、終了トークン読み込み403に「TRUE」が登録されている場合(S804:Yes)、S805に進む。終了トークン読み込み403に「FALSE」が登録されている場合(S804:No)、S806に進む。
S805で、構文解析器108は、終了トークン(トークン読み飛ばし規則114の終了402に登録されているトークン)を読み進める。
S806で、構文解析器108は、読み進めたトークン列をノードで束ね、構文木111に追加する。
以上が、「トークン読み飛ばし規則に基づく部分木作成と構文木への追加(図7のS708)」の処理の説明である。
ここで、この処理(図5のS502)の具体例を示す。ソースプログラム112の一例である900(図9)を用いて補足的に説明する。なお、以下の説明では、図5のS502(図7のS701からS708)の処理を全て実施することによって生成される構文木例1000(図10)を同時に参照しながら説明する。
また、前提として、図3のトークン定義113を利用したS501(図5)の処理により、英字は、トークン「STRING」に、「MOVE」、「EXEC」は、トークン「STMT_HEAD」に、「END−EXEC」はトークン「STMT_END」に変換済とし、構文解析器108への入力となるトークン読み飛ばし規則114は図4に示すものを用いるものとする。また、トークン「STMT_HEAD」から始まる構文の定義は、構文解析器108内で事前にはなされていないとする。本前提は例を説明するためのものであり、必ずしも同じ前提が必要であるわけではない。また、以降の説明中の記法で「「A」(A´)」は、A:トークン、A´:トークンのテキストを表す。
構文解析器108は、ソースプログラム例900(図9)のトークン列に対する処理を進め(図7のS701からS708までの処理を数回実行し)、構文解析器108内で定義された、「文」に対する処理を行う段階に至っているとする。また、構文解析器108内に、「「文」に対するトークン列は「STMT」ノードで束ねる」という規則が定義されているものとする。本前提も例を説明するためのものであり、必ずしも同じ前提が必要であるわけではない。
S701で、構文解析器108は、未処理のトークン「STMT_HEAD」(MOVE)が存在するため(S701:Yes)、S702に進む。
S702で、構文解析器108は、先頭トークン「STMT_HEAD」の読み込みと
構文の予測を行う。
S703で、構文解析器108は、先頭トークン「STMT_HEAD」から始まる構文がないと判断し(S703:No)、S708に進む。
S708で、構文解析器108は、トークン読み飛ばし規則114に基づく部分木作成と構文木への追加を行う。
上記S708「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例について、図8を参照しながら説明する。
S801で、構文解析器108は、先頭トークン「STMT_HEAD」のテキスト「MOVE」がトークン読み飛ばし規則114の開始401に登録されているため(S801:Yes)、S802に進む。
S802で、構文解析器108は、トークンを読み進め、トークン読み飛ばし規則114の終了402に登録されているトークン「STMT_HEAD」(EXEC)を発見するため(S802:Yes)、S804に進む。
S804で、構文解析器108は、トークン読み飛ばし規則114の終了トークン読み込み403に「FALSE」が登録されているため(S804:No)、S806に進む。
S806で、構文解析器108は、読み進めたトークン列「「STMT_HEAD(MOVE)」「STRING (A)」「TO」「STRING (E)」」(図10の1001)を「STMT」ノード1005で束ね、構文木111に追加する。
以上が、S708「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例の説明である。S708の処理後は、S701に戻る。ここまでの処理により、ソースプログラム112の一例である900(図9)の「EXEC」の手前までの処理が完了し、図10の1002が示す部分木が完成する。
引き続き、図7を用いて「トークン読み飛ばし規則利用を含む基本構文解析(図5のS502)」の処理例について、図7を参照しながら説明する。
S701で、構文解析器108は、未処理のトークン「STMT_HEAD」(EXEC)が存在するため(S701:Yes)、S702に進む。
S702で、構文解析器108は、先頭トークン「STMT_HEAD」の読み込みと
構文の予測を行う。
S703で、構文解析器108は、先頭トークン「STMT_HEAD」から始まる構文がないと判断し(S703:No)、S708に進む。
S708で、構文解析器108は、トークン読み飛ばし規則114に基づく部分木作成と構文木111への追加を行う。
上記S708「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例について、図8を参照しながら説明する。
S801で、構文解析器108は、先頭トークン「STMT_HEAD」のテキスト「EXEC」がトークン読み飛ばし規則114の開始401に登録されているため(S801:Yes)、S802に進む。
S802で、構文解析器108は、トークンを読み進め、トークン読み飛ばし規則114の終了402に登録されている、テキストが「END−EXEC」であるトークン「STMT_END(END−EXEC)」を発見するため(S802:Yes)、S804に進む。
S804で、構文解析器108は、トークン読み飛ばし規則114の終了トークン読み込み403に「TRUE」が登録されているため(S804:Yes)、S805に進む。
S805で、構文解析器108は、終了トークン「STMT_END(END−EXEC)」を読み進める。
S806で、構文解析器108は、読み進めたトークン列「「STMT_HEAD(EXEC)」「SQL」「STMT_HEAD(OPEN)」「testfile(STRING)」「STMT_END(END−EXEC)」」(図10の1003)を「STMT」ノード1005で束ね、構文木111に追加する。
トークン読み飛ばし規則114のデフォルトの終了402には、ピリオド「.」及び、トークン「STMT_HEAD」が登録されているため、デフォルトの規則に従うと「STMT_HEAD(EXEC)」から読み進めた後、「STMT_HEAD(OPEN)」の手前で終了してしまうが、トークン読み飛ばし規則114に、先頭401が「EXEC」の場合は、終了402が「END−EXEC」であると登録されていることにより、構文の終了位置を正しく認識できている。つまり、トークン読み飛ばし規則114の利用により、構文ごとに適切な読み進め方を実現できている。
以上が、S708「トークン読み飛ばし規則に基づく部分木作成と構文木への追加」の処理例の説明である。S708の処理後は、S701に戻り、未処理のトークンが存在しないため、処理を終了する。ここまでの処理により、ソースプログラム112の一例である900(図9)の「EXEC」から「END−EXEC」までの処理が完了し、図10の1004が示す部分木が完成する。
以上が、「トークン読み飛ばし規則利用を含む基本構文解析(図5のS502)」に対する、ソースプログラム112の一例である900を用いた補足説明である。
続いて、構文木訪問器追加処理について、図11を用いて説明する。構文木訪問器追加処理では、構文解析器108が生成した構文木111に対して、解析粒度を変更したい場合に行う処理である。例えば、構文木111が、文の区別を行うレベルである1501のような形状である場合に、IDの区別も行うレベルである1502のような形状に変更したい場合などが該当する。
S1101で、解析器106のユーザは、追加するべき構文木変換条件があるか否かを判定し、追加するべき構文木変換条件がある場合(S1101:Yes)、S1102に進む。追加するべき構文木変換条件がない場合(S1101:No)、本処理を終了する。
S1102で、解析器106のユーザは、構文木111の訪問と変換を行う構文木訪問器109を作成する。構文木訪問器の作成方法については種々の公知の方法を利用できる。例えば、構文木変換条件115から構文木訪問器109を自動生成できるパーサジェネレータを使用すれば、少ない記述量で構文木訪問器109を作成することができる。
S1103で、解析器106のユーザは、作成した構文木訪問器109を解析器106に追加する。解析器106への追加ができないという前提がある場合は、あらかじめ解析器106から、処理が空である構文木訪問器109を呼び出す仕組みにしておき、構文木変換の必要がある時に構文木訪問器109に処理を追加する方式にしておけばよい。
以上が、構文木訪問器追加処理(図11)の説明である。
ここで、図5のS503及びS504の処理の具体例を示す。
なお、以下の例では、前提として図3のトークン定義112及び図4のトークン読み飛ばし規則114を利用するものとし、S502までの処理により、図15の1501に示す構文木111を作成済であるものとする。
また、最初のS504の処理では、構文木例1501が表す構文木111を入力として処理を行うものとし、S1101からS1103までの処理により、次の2つの構文木変換を行う構文木訪問器109がそれぞれ作成されているものとする。
構文木訪問器(1):「「STRING」「OF」「STRING」」のパターンは、「ID」ノードを設けて束ねる。構文木訪問器(2):「「STMT_HEAD(MOVE)」「ID」「TO」「ノード」…」のパターンは、「TO」の手前の「ID」にRead属性(R)を付け、「TO」の後方にある「「ノード」…」にWrite属性(W)を付ける。「「ノード」…」は任意ノードが複数個続くことを意味する。なお、本前提は例を説明するためのものであり、必ずしも本発明がこれら前提に限定されるわけではない。
S503で、解析器106は、未処理の構文木訪問器109(上記(1))があるため(S503:Yes)、S504に進む。
S504で、解析器106は、構文木111の訪問と変換処理を行う。即ち、構文木111中に、「「STRING」「OF」「STRING」」のパターンを発見した場合、「ID」ノードを設け、束ねる。図15の1501が表す構文木111を対象とした場合、1504が示す「「STRING(A)」「OF」「STRING(B)」」と、1505が示す「「STRING(C)」「OF」「STRING(D)」」が該当し、これらをそれぞれ「ID」ノード1506で束ね、図15の1502が表す構文木111のように変換する。その後、S503の処理に戻る。
S503で、解析器106は、未処理の構文木訪問器109(上記(2))があるため(S503:Yes)、S504に進む。
S504で、解析器106は、構文木111の訪問と変換処理を行う。即ち、構文木111中に、「「STMT_HEAD(MOVE)」「ID」「TO」「ノード」…」のパターンを発見した場合、「TO」の手前の「ID」にRead属性(R)を付け、「TO」の後方にある「ID」にWrite属性(W)を付ける。図15の1502が表す構文木111を対象とした場合、変換後の構文木1503が示すように、ノード1507にRead属性(R)が付き、ノード1508にWrite属性(W)が付く。その後、S503の処理に戻る。
S503で、解析器106は、未処理の構文木訪問器109がないため(S503:No)、本処理を終了する。
上記例では、構文解析器108の出力である構文木例1501に対し、1つ目の構文木訪問器109で構文木例1502に変換し、2つ目の構文木訪問器109で、更に、構文木例1503に変換する流れになっている。
以上が、S503及びS504の具体例である。
上述の例で、構文木例1501のような文の区別を行うレベルの解析で十分な場面では、上述の構文木訪問器(1)、(2)は不要である。構文木例1502のようなIDの区別を行うレベルの解析が必要な場面では、構文木訪問器(1)のみを追加すればよい。構文木例1503のようなIDのRead/Writeの区別を行うレベルの解析が必要な場面では、更に、構文木訪問器(2)を追加する。このように、計算機100では、解析のニーズに合わせ構文解析器を作り直すことなく、事後的に変換処理を加えることで柔軟に解析粒度を変化させることが可能になる。
また、計算機100では、解析器106の外部にあるトークン定義113やトークン読み飛ばし規則114の利用により、構造が不明な構文に対しても、構文単位でトークン列を集約することを実現している。例えば、上述の例のように、「STMT_HEAD(MOVE)」から始まる構文が未定義であるとしても、構文木例1501のように、構文単位でトークン列を集約することができていた。そのため、先の例のように、事後的に構文木の形状の変換を行う際に目的に合った変換が可能となる。例えば、上記構文木訪問器(2)の変換後の構文木例1503において、「TO」の手前にある「ID」(1507)2箇所にRead属性(R)を正しく付けることができている。
もし、構造が不明な構文に対して、トークン定義113やトークン読み飛ばし規則114を利用せず、次の解析可能な文まで読み飛ばしていた場合、図12の1600のような構文木となる。このように、2つ目の「MOVE」(1603)も、1つ目の「MOVE」(1601)の「TO」(1602)の後方にある1つの要素として判断され、Write属性(W)が付けられてしまう。また、本来であれば、Read属性(R)を付けるべきである、「TO」の手前の「ID」トークン(1604)にも、同様の理由でWrite属性(W)が付けられてしまい、いずれも誤った解析となる。

Claims (11)

  1. ソースプログラムからソースプログラムの構造を表す木構造データを生成する計算機であって、
    構文要素に対応する文字列候補を外部ファイルとして格納する記憶部と、
    文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行する制御部と、
    を有する計算機。
  2. 請求項1に記載の計算機であって、
    前記記憶部が、構文要素の読み飛ばし規則を外部ファイルとして更に格納するものであり、
    前記制御部が、
    前記外部ファイルにアクセスして、前記入力された文字列から構文要素の列を生成する字句解析部と、
    前記外部ファイルにアクセスして、前記字句解析部が生成した構文要素の列から構文木を生成する構文解析部と、を有するものである計算機。
  3. 請求項2に記載の計算機であって、
    前記構文解析部が、入力された構文要素の列が構文規則に合致する場合、該構文規則に応じた部分木作成及び構文木への追加処理を実行し、入力された構文要素の列が構文規則に合致しない場合、前記構文要素の読み飛ばし規則に基づき構文要素を読み進め、部分木作成と構文木への追加を実行するものである計算機。
  4. 請求項2に記載の計算機であって、
    前記記憶部が、前記構文解析部によって生成する構文木の変換条件を定める変換条件を更に外部ファイルとして格納するものであり、
    前記制御部が、
    前記構文解析部によって生成された構文木について、前記外部ファイルにアクセスし、該構文木が前記変換条件に合致する場合、該変換条件に基づいて構文木を変換する構文木訪問部を更に有する計算機。
  5. 請求項1〜4の何れか一項に記載の計算機であって、
    前記計算機が、前記外部ファイルの更新入力を受け付ける入力部を有するものである計算機。
  6. ソースプログラムからソースプログラムの構造を表す木構造データを生成する計算機に、
    構文要素に対応する文字列候補を外部ファイルとして格納する手順と、
    文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列について、該文字列候補に対応する構文要素への変換処理を実行する手順と、
    を実行させるプログラム。
  7. 請求項6に記載のプログラムであって、
    前記記憶部に、構文要素の読み飛ばし規則を外部ファイルとして更に格納する手順を実行させ、
    前記変換処理を実行する手順で、
    前記外部ファイルにアクセスして、前記入力された文字列から構文要素の列を生成する字句解析手順と、
    前記外部ファイルにアクセスして、前記字句解析部が生成した構文要素の列から構文木を生成する構文解析手順と、を実行させるプログラム。
  8. 請求項7に記載のプログラムであって、
    前記構文解析手順で、入力された構文要素の列が構文規則に合致する場合、該構文規則に応じた部分木作成及び構文木への追加処理を実行し、入力された構文要素の列が構文規則に合致しない場合、前記構文要素の読み飛ばし規則に基づき構文要素を読み進め、部分木作成と構文木への追加を実行する手順を実行させるプログラム。
  9. 請求項7に記載のプログラムであって、
    前記記憶部に、前記構文解析手順によって生成された構文木の変換条件を定める変換条件を更に外部ファイルとして格納する手順と、
    前記構文解析手順によって生成された構文木について、前記外部ファイルにアクセスし、該構文木が前記変換条件に合致する場合、該変換条件に基づいて構文木を変換する構文木訪問手順と、を更に実行させるプログラム。
  10. 請求項7〜9の何れか一項に記載のプログラムであって、
    前記計算機の入力装置を介した入力に応じて、前記外部ファイルの更新を行う手順を実行させるプログラム。
  11. ソースプログラムからソースプログラムの構造を表す木構造データを生成するデータ生成方法であって、
    計算機が、
    構文要素に対応する文字列候補を外部ファイルとして記憶部に格納するステップと、
    文字列の入力に対し、前記外部ファイルにアクセスし、前記文字列候補に一致する文字列ついて、該文字列候補に対応する構文要素への変換処理を実行するステップと、
    を含むデータ生成方法。
JP2013087042A 2013-04-18 2013-04-18 計算機、プログラム及びデータ生成方法 Expired - Fee Related JP5932707B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2013087042A JP5932707B2 (ja) 2013-04-18 2013-04-18 計算機、プログラム及びデータ生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013087042A JP5932707B2 (ja) 2013-04-18 2013-04-18 計算機、プログラム及びデータ生成方法

Publications (2)

Publication Number Publication Date
JP2014211729A true JP2014211729A (ja) 2014-11-13
JP5932707B2 JP5932707B2 (ja) 2016-06-08

Family

ID=51931457

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013087042A Expired - Fee Related JP5932707B2 (ja) 2013-04-18 2013-04-18 計算機、プログラム及びデータ生成方法

Country Status (1)

Country Link
JP (1) JP5932707B2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112989345A (zh) * 2021-03-17 2021-06-18 北京安天网络安全技术有限公司 一种威胁处置方法及框架
CN114666078A (zh) * 2020-12-08 2022-06-24 北京中科网威信息技术有限公司 Sql注入攻击的检测方法及系统、电子设备及存储介质

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH02133824A (ja) * 1988-11-14 1990-05-23 Yokogawa Electric Corp トランスレータ
JPH02190935A (ja) * 1989-01-19 1990-07-26 Nec Corp 構文解析ルールの組込機能を持つプログラムのコンパイル方式
JPH0328932A (ja) * 1989-06-27 1991-02-07 Hitachi Ltd 拡張された言語仕様のコンパイル方式
JPH03268029A (ja) * 1990-03-19 1991-11-28 Fujitsu Ltd 構文チェッカ
JPH08272622A (ja) * 1995-03-31 1996-10-18 Hitachi Software Eng Co Ltd プログラム変換装置
JPH09167095A (ja) * 1995-12-14 1997-06-24 Fujitsu Ltd ソースプログラム解析装置
JPH11249903A (ja) * 1998-02-26 1999-09-17 Agency Of Ind Science & Technol 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置
US20100023924A1 (en) * 2008-07-23 2010-01-28 Microsoft Corporation Non-constant data encoding for table-driven systems
JP2012504826A (ja) * 2008-10-06 2012-02-23 マイクロソフト コーポレーション 拡張可能な構文を有するプログラミング言語

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH02133824A (ja) * 1988-11-14 1990-05-23 Yokogawa Electric Corp トランスレータ
JPH02190935A (ja) * 1989-01-19 1990-07-26 Nec Corp 構文解析ルールの組込機能を持つプログラムのコンパイル方式
JPH0328932A (ja) * 1989-06-27 1991-02-07 Hitachi Ltd 拡張された言語仕様のコンパイル方式
JPH03268029A (ja) * 1990-03-19 1991-11-28 Fujitsu Ltd 構文チェッカ
JPH08272622A (ja) * 1995-03-31 1996-10-18 Hitachi Software Eng Co Ltd プログラム変換装置
JPH09167095A (ja) * 1995-12-14 1997-06-24 Fujitsu Ltd ソースプログラム解析装置
JPH11249903A (ja) * 1998-02-26 1999-09-17 Agency Of Ind Science & Technol 抽象構文木処理方法、抽象構文木処理プログラムを記録したコンピュータ読み取り可能な記録媒体、抽象構文木データを記録したコンピュータ読み取り可能な記録媒体、及び、抽象構文木処理装置
US20100023924A1 (en) * 2008-07-23 2010-01-28 Microsoft Corporation Non-constant data encoding for table-driven systems
JP2012504826A (ja) * 2008-10-06 2012-02-23 マイクロソフト コーポレーション 拡張可能な構文を有するプログラミング言語

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114666078A (zh) * 2020-12-08 2022-06-24 北京中科网威信息技术有限公司 Sql注入攻击的检测方法及系统、电子设备及存储介质
CN114666078B (zh) * 2020-12-08 2022-12-20 北京中科网威信息技术有限公司 Sql注入攻击的检测方法及系统、电子设备及存储介质
CN112989345A (zh) * 2021-03-17 2021-06-18 北京安天网络安全技术有限公司 一种威胁处置方法及框架
CN112989345B (zh) * 2021-03-17 2024-04-12 北京安天网络安全技术有限公司 一种威胁处置方法及框架

Also Published As

Publication number Publication date
JP5932707B2 (ja) 2016-06-08

Similar Documents

Publication Publication Date Title
US9298453B2 (en) Source code analytics platform using program analysis and information retrieval
CN114585999A (zh) 多语言代码行补全系统
CN108139891B (zh) 用于生成建议以纠正未定义标记错误的方法和系统
US8364696B2 (en) Efficient incremental parsing of context sensitive programming languages
US9311077B2 (en) Identification of code changes using language syntax and changeset data
CN111443964B (zh) 更新用户界面的方法、设备和计算机可读存储介质
US20230418566A1 (en) Programmatically generating evaluation data sets for code generation models
JP7344259B2 (ja) 深層学習フレームワークにおけるパターン変換方法、装置、電子デバイス、コンピューター記憶媒体およびコンピュータープログラム製品
KR20190015285A (ko) Cpu 이용 및 코드 리팩토링을 위한 쿼리 최적화기
CN111124379A (zh) 页面生成方法、装置、电子设备及存储介质
CN106484389B (zh) 动作流分段管理
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
US10545741B2 (en) Information processing apparatus, method of compiling, and storage medium
US12014155B2 (en) Constrained prefix matching for generating next token predictions
US20230419036A1 (en) Random token segmentation for training next token prediction models
US20230418565A1 (en) Validating and providing proactively generated code suggestions
JP5808264B2 (ja) コード生成装置及びコード生成方法及びプログラム
CN110928896A (zh) 一种数据查询方法及装置
CN111563363B (zh) 一种超文本标记语言文档内容生成及解析方法
US20130218928A1 (en) Information processing device
JP2018173699A (ja) テンプレート生成装置、テンプレート生成方法およびプログラム
US20160371066A1 (en) Computer that performs compiling, compiling method and storage medium that stores compiler program
US20180011833A1 (en) Syntax analyzing device, learning device, machine translation device and storage medium
JP6175306B2 (ja) 制御プログラム分割装置、制御プログラム分割方法及びその記録媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20150428

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160120

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160202

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160317

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160405

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160428

R151 Written notification of patent or utility model registration

Ref document number: 5932707

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R151

LAPS Cancellation because of no payment of annual fees