JPH06124211A - プログラム解析装置 - Google Patents

プログラム解析装置

Info

Publication number
JPH06124211A
JPH06124211A JP4275614A JP27561492A JPH06124211A JP H06124211 A JPH06124211 A JP H06124211A JP 4275614 A JP4275614 A JP 4275614A JP 27561492 A JP27561492 A JP 27561492A JP H06124211 A JPH06124211 A JP H06124211A
Authority
JP
Japan
Prior art keywords
declarator
declaration
direct
detected
source program
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.)
Withdrawn
Application number
JP4275614A
Other languages
English (en)
Inventor
Yotaro Kitadate
陽太郎 北館
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.)
Fujitsu Ltd
Original Assignee
Fujitsu 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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP4275614A priority Critical patent/JPH06124211A/ja
Publication of JPH06124211A publication Critical patent/JPH06124211A/ja
Priority to US08/739,215 priority patent/US5649201A/en
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing

Landscapes

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

Abstract

(57)【要約】 【目的】本発明は、Cソースプログラム部分が宣言か関
数定義かを判別するプログラム解析装置に関し、Cソー
スプログラム内の指定された関数の開始位置を、正確か
つ高速に特定できるようにすることを目的とする。 【構成】Cソースプログラム部分の{ }外において、
直接宣言子または「;」の出現を検出するDD検出処理
部10を備え、DD検出処理部10が「;」を検出する
ときには、そのCソースプログラム部分を宣言と判定
し、一方、DD検出処理部10が直接宣言子を検出する
ときにあって、該直接宣言子の次の入力が、「=」
か「,」か「;」のいずれかの内の1つであることを検
出するときには、そのCソースプログラム部分を宣言と
判定するとともに、該直接宣言子の次の入力が、それ以
外であることを検出するときには、そのCソースプログ
ラム部分を関数定義と判定するように構成する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、C言語で書かれたソー
スプログラムを解析するプログラム解析装置に関し、特
に、ソースプログラム内の指定された関数名を有する関
数の開始位置を、正確かつ高速に特定できるようにする
プログラム解析装置に関する。
【0002】プログラム言語によってソースプログラム
を記述し、それをコンパイラによって機械語に翻訳して
実行させると、プログラムミスにより、非所望の結果が
得られたり、実行途中で異常終了することがある。この
ときには、どのような条件でこの現象が発生したのかを
調べるとともに、プログラム中の誤りを発生させた原因
箇所を求める必要がある。
【0003】その方法として、例えばデバッガと呼ばれ
る支援プログラムを用いる方法が広く用いられている。
この支援プログラムを用いると、異常終了時のCPUの
レジスタや主記憶の状態をもとに、そのプログラムの中
で最後に実行されていた関数(サブルーチン)の関数名
を知ることができるので、上記の作業を効率よく実行で
きるからである。
【0004】このような支援プログラムに加えて、指定
した関数名を有する関数の記述内容の見直しを支援する
会話型プログラムが用意されていれば、更に、その作業
効率が上がることが期待される。この会話型プログラム
は、関数名を指定してから解析を始めるまでの時間が早
いことが必要である。そのためには、指定された関数名
から、その関数の開始位置を迅速に求めることが要求さ
れる。
【0005】
【従来の技術】C言語のプログラムは、宣言と関数定義
の集まりであるが、宣言や関数定義の区別を示したり、
それらの始まりと終わりを指示する特別の記号や文字列
は存在しない。このため、指定された関数の開始位置を
求めるには、プログラムの先頭から宣言や関数定義の終
了位置を順次画定していくことが必要である。その1つ
の方法は、プログラムの先頭から文法規則に照らして順
に解析する方法である。すなわち、コンパイラにおける
構文解析処理と同様に、解析木を生成しつつ、あるい
は、プログラムの細部に至るまでC言語の生成規則を適
用しながら、1つ1つの宣言や関数定義の終了位置を画
定していく方法である。
【0006】また、別の方法としては、コンパイラが翻
訳処理を行った際に、各関数の開始行位置をシンポル情
報としてオブジェクトプログラムの中に出力してくるの
で、それを利用する方法もある。
【0007】
【発明が解決しようとする課題】しかしながら、前者の
従来技術に従うと、プログラムの先頭から文法規則に照
らして順に解析しつつ、あるいは、プログラムの細部に
至るまでC言語の生成規則を適用しながら、1つ1つの
宣言や関数定義の終了位置を画定していくことから、目
的の関数に到達するまでに時間がかかるという問題点が
ある。
【0008】また、後者の従来技術に従うと、前者の従
来技術よりも高速処理が可能であるものの、厳密な意味
での開始行を示さず、例えば関数名の存在する行を示す
ことがあるという問題点がある。また、C言語では、1
行に複数の関数を記述することも理論的には可能である
ことから、行位置によって関数の開始位置を示すことが
不可能な場合もあるという問題点もある。
【0009】本発明はかかる事情に鑑みてなされたもの
であって、文法的に誤りのないことの保証されているC
言語のソースプログラムを処理対象として、そのC言語
のソースプログラム内の指定された関数の開始位置を、
正確かつ高速に特定できるようにする新たなプログラム
解析装置の提供を目的とする。
【0010】
【課題を解決するための手段】図1に本発明の原理構成
を図示する。図中、1は本発明により構成されるプログ
ラム解析装置であって、Cソースプログラムをトークン
を単位として入力する構成を採って、入力Cソースプロ
グラム部分が宣言か関数定義かを判定するよう処理する
もの、2はスキャナ装置であって、プログラム解析装置
1の解析対象となるCソースプログラムをトークンを単
位として分解して、その分解したCソースプログラムを
プログラム解析装置1に入力するよう処理するものであ
る。
【0011】本発明により構成されるプログラム解析装
置1は、入力Cソースプログラム部分の{ }外におい
て、直接宣言子または「;」の出現を検出するDD検出
処理部10と、DD検出処理部10の検出結果を受け取
り、それに続く入力トークンの識別処理を実行すること
で、入力Cソースプログラム部分が宣言か関数定義かを
判定する識別処理部11と、例えば識別処理部11に展
開されて、宣言/関数定義の終了位置を検出する終了位
置検出部12と、ユーザ定義の型名(int やcharに相
当)を管理する定義型名一覧表13と、定義型名一覧表
13への登録処理を実行する型定義処理部14とを備え
る。
【0012】
【作用】本発明では、DD検出処理部10は、入力Cソ
ースプログラム部分の{ }外において「;」の出現を
検出すると、その「;」までを1つの宣言と判定する。
【0013】同時に、DD検出処理部10は、入力Cソ
ースプログラム部分の{ }外において直接宣言子の出
現を検出する。この直接宣言子の出現の検出処理は、具
体的には、入力Cソースプログラム部分の{ }外にお
いて、「struct」、「union」または「enum」の直後に
位置しない識別子(変数名や関数名に相当)の出現を検
出するときにあって、その識別子に続く「( ..)」
と「〔 ..〕」とからなる並びを読み飛ばしていっ
て、その読み飛ばし部分の最後でもって直接宣言子の出
現を検出することで実行するとともに、入力Cソースプ
ログラム部分の{}外において、「(」の出現を検出す
るときにあって、その「(」の対となる「)」を検出し
て、その「)」に続く「( ..)」と「〔 ..〕」
とからなる並びを読み飛ばしていって、その読み飛ばし
部分の最後でもって直接宣言子の出現を検出することで
実行することになる。また、上で「(」の検出は抑止
し、入力Cソースプログラム部分の{ }外において、
「struct」、「union 」または「enum」の直後に位置し
ない識別子の出現を検出するときにあって、その識別子
の後に出現する「)」と「( ..)」と
「〔 ..〕」とからなる並びを読み飛ばしていって、
その読み飛ばし部分の最後でもって直接宣言子の出現を
検出することで実行することになる。
【0014】DD検出処理部10が、入力Cソースプロ
グラム部分の{ }外において直接宣言子の出現を検出
すると、識別処理部11は、その直接宣言子の次の入力
が、「=」か「,」か「;」のいずれかの内の1つであ
るか否かを識別して、この3つの内のいずれかであるこ
とを検出すると、入力Cソースプログラム部分を宣言と
判定する。このとき、終了位置検出部12は、識別処理
部11により直接宣言子の次の入力が「;」であること
が検出されると、その「;」までを1つの宣言と判定す
る。また、識別処理部11により直接宣言子の次の入力
が「=」か「,」であることが検出されると、それに続
く対称記号外、すなわち、「( ..)」、
「{ ..}」、
「〔 ..〕」、「”..”」、「’..’」外におい
て出現する「;」を検出して、そこまでを1つの宣言と
判定する。
【0015】一方、識別処理部11は、直接宣言子の次
の入力が上記の3つの内のいずれでもないことを検出す
ると、入力Cソースプログラム部分を関数定義と判定す
る。このとき、終了位置検出部12は、識別処理部11
により直接宣言子の次の入力が「{」であることが検出
されると、その「{」の対となる「}」を検出して、そ
こまでを1つの関数定義と判定する。また、識別処理部
11により直接宣言子の次の入力が、「;」、「=」、
「,」、「{」以外のものであることが検出されると、
それに続く対称記号外において出現する「;」と「{」
との連続対を検出し、その連続対中の「{ 」の対とな
る「}」を検出して、そこまでを1つの関数定義と判定
する。
【0016】また、DD検出処理部10が、入力Cソー
スプログラム部分の{ }外において直接宣言子の出現
を検出すると、識別処理部11は、その直接宣言子の中
の最初の識別子の次が「(」であり、かつ、その直接宣
言子に続く入力が、「,」か「;」であるか否かを検出
して、この状態にあることを検出すると、入力Cソース
プログラム部分を宣言と判定する。一方、識別処理部1
1は、その直接宣言子の中の最初の識別子の次が「(」
であるものの、その直接宣言子に続く入力が、「,」と
「;」のいずれでもないことを検出すると、入力Cソー
スプログラム部分を関数定義と判定する。一方、識別処
理部11は、その直接宣言子の中の最初の識別子の次が
「(」以外であることを検出すると、入力Cソースプロ
グラム部分を宣言と判定する。
【0017】そして、DD検出処理部10は、ユーザ定
義の型名がCソースプログラムに含まれている場合に
は、その型名をDD検出処理から排除するために、入力
Cソースプログラム部分の{ }外において「typedef
」の出現を検出する構成を採る。DD検出処理部10
は、「typedef 」の出現を検出すると、入力Cソースプ
ログラム部分を宣言と判定する。型定義処理部14は、
この「typedef 」検出時に、「typedef 」の後に続くユ
ーザ定義の型名を定義型名一覧表13に登録し、DD検
出処理部10は、このようにして定義型名一覧表13に
登録された型名については識別子として扱わないように
することで、識別子の検出処理からの排除を実現する。
【0018】このように、本発明によれば、解析木を生
成することなく、かつ、プログラムの細部までC言語の
生成規則を適用することなく、かつ、コンパイラにより
得られるシンボル情報を用いることなく、Cソースプロ
グラム内の指定された関数の開始位置を求めることがで
きるので、Cソースプログラム内の指定された関数の開
始位置を正確かつ高速に求めることができるようにな
る。
【0019】
【実施例】以下、実施例に従って本発明を詳細に説明す
る。図2に、デジタル計算機上で実現した本発明の一実
施例を図示する。
【0020】図中、20は外部記憶装置に格納される解
析対象のCソースプログラムであって、インクルード処
理やマクロ展開されたC言語記述のソースプログラムで
あるもの、21は外部記憶装置に展開される関数定義一
覧表出力域であって、本発明により求められたCソース
プログラム20中の関数定義の位置情報を管理するもの
である。
【0021】30は主記憶装置上に展開されるスキャナ
プログラム、31は主記憶装置上に展開されるプログラ
ム解析装置プログラム、32は主記憶装置上に展開され
るCソース入力バッファ、33は主記憶装置上に展開さ
れる開始位置退避域、34は主記憶装置上に展開される
定義型名一覧表、35は主記憶装置上に展開される関数
定義一覧表である。
【0022】スキャナプログラム30は、OSに依頼し
て、外部記憶装置上に格納されるCソースプログラム2
0をCソース入力バッファ32に読み込む。続いて、C
ソース入力バッファ32に読み込んだ文字列から、連続
するいくつかの文字を1つのトークンとして切り出して
トークン情報を作成して出力する。スキャナプログラム
30は、1つのトークン情報を作成する度毎に、この作
成したトークン情報をプログラム解析装置プログラム3
1に渡していくよう処理する。
【0023】スキャナプログラム30により切り出され
るトークンには、if,else等の予約語の他、プログラマ
が定義した変数名・関数名等の識別子や、定数や、文字
列や、+,−等の演算子等がある。C言語でいう文字定
数(’.’)や、文字列(”..”)を1つのトークン
として扱う方法と、単独の「’」や、「”」をトークン
として扱い、かつ対称記号の1つとして扱う方法とがあ
る。以下の実施例では、前者の方法、つまり文字定数や
文字列を1つのトークンとする方法を採るものとする。
【0024】また、スキャナプログラム30より出力さ
れるトークン情報には、図3に示すように、トークンの
種別(識別子,if,else,+,−等の区分)と、トーク
ンの先頭文字のファイル中における文字位置、ソースプ
ログラム中の行位置、桁位置と、トークンリテラルであ
るトークンの文字列(識別子、定数、定義された文字列
の内容等)とが含まれるものである。
【0025】一方、プログラム解析装置プログラム31
は、プログラム間通信によって、あるいはスキャナプロ
グラム30をサブルーチンとして呼び出すことで順次ト
ークン情報を得る。そして、1つの宣言又は関数定義の
先頭トークンについては、トークン中にある位置情報を
開始位置退避域33に格納しつつ、以下に説明する処理
手順に従って、入手したトークンが関数定義か宣言かを
判別し、1つの関数定義が終わる度に、その関数名と開
始位置情報とを関数定義一覧表35に出力する。そし
て、Cソースプログラム20の最後まで解析すると、関
数定義一覧表35に展開したデータを外部記憶装置の関
数定義一覧表出力域21に出力して処理を終了する。
【0026】図4に、この関数定義一覧表35のデータ
構造を図示する。この図に示すように、関数定義一覧表
35は、関数名と、Cソースプログラム20上の開始行
位置を示す開始行位置と、Cソースプログラム20上の
開始桁位置を示す開始桁位置と、その関数定義のファイ
ル中における開始文字位置を示すファイル中文字位置と
を管理するデータ構造を持つものである。
【0027】次に、プログラム解析装置プログラム31
の実行するCソースプログラム20に対しての解析処理
について詳細に説明する。図5及び図6に、プログラム
解析装置プログラム31の実行するメインルーチン処理
の処理フローの一実施例を図示する。
【0028】プログラム解析装置プログラム31は、図
5の処理フローに従う場合には、先ず最初に、ステップ
1で、サブルーチンの開始位置退避処理を呼び出して、
先頭トークンの位置情報を開始位置退避域33に退避す
る。次に、ステップ2で、サブルーチンのDD検出処理
を呼び出して、入力されてくるCソースプログラム20
の{ }外において、「;」、直接宣言子(DD)、
「typedef(TD)」、「EOF (end of file)」の出現を
検出する処理に入る。
【0029】ステップ2のDD検出処理に従っ
て、「;」を検出すると、その「;」までを宣言である
と判定してステップ1に戻る。一方、「typedef 」を検
出すると、宣言であると判定するとともに、ステップ3
に進んで、サブルーチンとして型定義処理を呼び出し
て、「typedef 」に続くユーザ定義の型名を定義型名一
覧表34に登録してステップ1に戻る。DD検出処理
は、このようにして定義型名一覧表34に登録された型
名については識別子として扱わないように処理すること
で、「typedef 」に続いて定義されるユーザ定義の型名
については識別子と扱わないように処理する。一方、
「EOF 」を検出すると、ステップ4に進んで、サブルー
チンの関数定義一覧表出力処理を呼び出して、関数定義
一覧表35に展開したデータを外部記憶装置の関数定義
一覧表出力域21に出力して処理を終了する。
【0030】そして、ステップ2のDD検出処理に従っ
て、直接宣言子(DD)を検出すると、ステップ5に進
んで、サブルーチンとして識別処理を呼び出して、その
直接宣言子の次のトークンが、「=」か「,」か「;」
のいずれかの内の1つであるか否かを識別する。このス
テップ5の識別処理に従って、「;」を検出すると、そ
の「;」までを宣言であると判定してステップ1に戻
る。一方、「=」か「,」を検出すると、ステップ6に
進んで、サブルーチンの終了位置検出処理を呼び出し
て、それに続く対称記号外において出現する「;」を検
出して、そこまでを宣言と判定してステップ1に戻る。
【0031】そして、ステップ5の識別処理に従って、
直接宣言子の次のトークンが上記の3つの内のいずれで
もないことを検出すると、関数定義であると判定すると
ともに、ステップ7に進んで、サブルーチンの終了位置
検出処理を呼び出して、直接宣言子の次の入力が「{」
であった場合は、その「{」の対となる「}」を検出し
て、そこまでを1つの関数定義と判定し、直接宣言子の
次の入力が「{」以外のものであった場合は、それに続
く対称記号外において出現する「;」と「{」との連続
対を検出し、その連続対中の「{」の対となる「}」を
検出して、そこまでを1つの関数定義と判定する。続い
て、ステップ8に進んで、サブルーチンの関数定義登録
処理を呼び出して、検出した関数名と、その関数の開始
位置情報を関数定義一覧表35に登録してからステップ
1に戻る。
【0032】このようにして、プログラム解析装置プロ
グラム31は、図5の処理フローに従って、解析対象と
なるCソースプログラム20に記述される関数名と、そ
の関数の開始位置情報とを検出していくよう処理するの
である。
【0033】一方、プログラム解析装置プログラム31
は、図6の処理フローに従う場合には、先ず最初に、ス
テップ1で、サブルーチンのDD検出処理を呼び出し
て、入力されてくるCソースプログラム20の{ }外
において、「;」、直接宣言子の出現を検出する処理に
入る。
【0034】ステップ1のDD検出処理に従っ
て、「;」を検出すると、その「;」までを宣言である
と判定する。一方、ステップ1のDD検出処理に従っ
て、直接宣言子の出現を検出すると、ステップ2に進ん
で、その直接宣言子の中の最初の識別子の次が「(」で
あったか否かをチェックし、続くステップ3で、このチ
ェック結果に従って、その直接宣言子の中の最初の識別
子の次が「(」でないことを判断するときには、入力さ
れてきたCソースプログラム20が宣言であると判定す
る。
【0035】一方、ステップ3で、その直接宣言子の中
の最初の識別子の次が「(」であること判断するときに
は、ステップ4に進んで、その直接宣言子に続く次のト
ークンが「,」か「;」であるか否かを検出し
て、「,」か「;」であることを検出すると、入力され
てきたCソースプログラム20が宣言であると判定し、
「,」と「;」のいずれでもないことを検出すると、入
力されてきたCソースプログラム20が関数定義である
と判定する。
【0036】図6に示す実施例においては、プログラム
解析装置プログラム31は、図6の処理フローに従っ
て、解析対象となるCソースプログラム20の中の入力
部分が関数定義であるか、宣言であるかを判別すること
ができる。
【0037】図7に、図5のメイン処理ルーチンの処理
フローに従う場合の状態遷移図を図示する。図中、○で
囲ってある1つ1つが状態を表しており、そこでは、同
じ名前の処理部が起動されることになる。
【0038】初期状態は「はじめ」である。ここから、
トークン情報を読まずに、直ちに次の状態である開始位
置退避処理に移行する。ここで、先頭トークンを得て、
その位置情報を開始位置退避域33に退避し、トークン
位置を1つ戻してからDD検出処理の状態に移行する。
このようにして起動されると、DD検出処理は、トーク
ンを順次入力しつつ処理する。
【0039】DD検出処理の結果がTD終了、すなわ
ち、「typedef 」というトークンの検出であれば、図中
のTDを付した矢印に従って型定義処理の状態に移行す
る。ここでは、続くトークン列より、プログラマが定義
した型名を抽出して定義型名一覧表34に追加する。型
定義処理が終了すると、再び開始位置退避処理の状態に
戻る。一方、DD検出処理により「;」が検出されると
きには、宣言終了の状態に移行し、そこまでのトークン
列が宣言であることを検出して再び開始位置退避処理の
状態に戻る。
【0040】一方、DD検出処理の結果がDD終了、す
なわち、直接宣言子の検出であれば、識別処理の状態に
移行する。ここでは、続くトークンを入力して、「;」
であるときには、宣言終了の状態に移行し、トークン列
が宣言であることを検出して再び開始位置退避処理の状
態に戻る。また、「=」か「,」であるときには、待ち
Cの状態に移行して、それに続く、対称記号外において
出現する「;」を検出して宣言終了の状態に移行し、ト
ークン列が宣言であることを検出して再び開始位置退避
処理の状態に戻る。また、直接宣言子に続くトークンが
「{」であったときには、待ちBの状態に移行し、その
「{」の対となる「}」を検出し、関数終了に移行して
トークン列が関数定義であることを検出して、関数名/
関数開始位置情報を関数定義一覧表35に登録してか
ら、再び開始位置退避処理の状態に戻る。また、直接宣
言子に続くトークンが「;」、「,」、「=」、「{」
のいずれでもなかった場合は、DS終了(Declaration
Specifire /宣言指定子の検出)を行い、続いて待ちA
の状態に移行し、そこで、それに続く対称記号外におい
て出現する「;」と「{」との連続対を検出すると、待
ちBの状態に移行し、その連続対中の「{」の対となる
「}」を検出し、関数終了に移行してトークン列が関数
定義であることを検出して、関数名/関数開始位置情報
を関数定義一覧表35に登録してから、再び開始位置退
避処理の状態に戻る。
【0041】そして、DD検出処理の結果がEOF終
了、すなわち、解析対象となるCソースプログラム20
の終了を検出するときには、「おわり」の状態に移行し
て、関数定義一覧表35に展開したデータを外部記憶装
置の関数定義一覧表出力域21に出力して処理を終了す
る。
【0042】図8に、図7中のDD検出処理の詳細な状
態遷移図を図示する。初期状態は「はじめ」である。こ
こから、直ちに次の状態である「待ち」状態に移行し、
ここで、トークンを読む。この状態から出るいずれかの
矢印に付したトークンを読んだら、その矢印に従って次
の状態に移行する。それ以外であれば、同じ状態で次の
トークンを読む。
【0043】「typedef 」というトークンを検出した場
合には、その入力トークン列は文法的には宣言に分類さ
れるが、処理の必要上、その先で型定義処理が呼ばれる
ことになる。
【0044】「identifier」は識別子の意味である。こ
れは、英字か下線で始まり、英数字か下線からなる文字
の並びで、かつ予約語(キーワード)以外のもの(これ
を名前と呼ぶ)であるが、このような文字並びには定義
型名もある。この定義型名は、プログラマが定義した例
えば整数型int と同じように使える型の名前であり、
「typedef 」というトークンを伴った宣言において定義
されたものである。プログラムの中で、それ以前に型名
として定義された名前は型名と解釈される。それ以外の
名前は識別子と解釈される。本発明では、定義型名につ
いては識別子とは扱わないよう処理し、定義型名一覧表
34に登録されているか否かに従ってそれを判定する。
すなわち、名前を検出する度に定義型名一覧表34を検
索して、存在すれば型名、存在しなければ識別子と判定
するのである。
【0045】「レベル」とは、レベル処理を意味する。
これは、例えば、「(」か「〔」か「{」を読んだとき
に、内部のカウンタを+1し、「)」か「〕」か「}」
を読んだときに、そのカウンタを−1し、その結果、カ
ウンタの計数値が0になったときに復帰する処理であ
る。すなわち、対称記号の内側は外側よりもレベルが1
だけ高いと考えるのである。これは、「(」と「)」等
で囲まれた範囲を読み飛ばすのに使われる。レベル処理
の別の方法は、そこに移行した原因となった左対称記号
「(」、「〔」、「{」の内の1つと、それに対応する
右対称記号「)」、「〕」、「}」のいずれかのみをカ
ウントの対象とする方法である。例えば、「{」によっ
て移行した場合には、以後「{」によってカウンタを+
1し、「}」によって−1する。それ以外の対称記号で
は変化しない。「〔」や「(」についても同様である。
【0046】「戻し」とは、入力するトークン位置を1
つ前に戻すことである。これによって、最後に読み込ん
だトークンが、次の読み込みで再びスキャナプログラム
30より与えられることになる。
【0047】この図8に示すように、「identifier(識
別子)」を検出すると、経過処理によって、続く
「〔 ..〕」や「( ..)」がレベル処理に従って
読み飛ばされる。この意味は、DD(Direct Declarato
r 、直接宣言子)の最後まで読み飛ばすことである。ま
た、「待ち」において、「(」を検出すると、途中で識
別子の現れることを予期しつつ対応の「)」まで読み飛
ばした後、経過処理によって、続く「〔 ..〕」や
「( ..)」を読み飛ばす。そして、はじめのレベル
処理の中で識別子が現れた場合、それが関数名となる可
能性があるので、関数名仮登録処理によって識別子名を
関数定義一覧表35に追加する。これが、後で宣言であ
ると判明した場合には、その登録を削除する。
【0048】図9に、図7に示した識別処理の詳細な状
態遷移図を図示する。この図に示すように、識別処理で
は、DD検出処理で検出された直接宣言子の次に読み込
んだトークンが「;」、「,」、「=」、「{」のいず
れかであったら、それぞれを終了原因として返し、それ
以外のトークンであったら、DS終了の情報を返すよう
処理するのである。
【0049】図10に、図7に示した「待ち」の処理の
詳細な状態遷移図を図示する。ここで、図10(a)が
「待ちA」の状態遷移図、図10(b)が「待ちB」の
状態遷移図、図10(c)が「待ちC」の状態遷移図で
ある。
【0050】この図10(a)に示すように、「待ち
A」では、対称記号「( )」、「〔〕」、「{ }」
の外で、「;{」というトークン列を検出したら処理を
終了する。また、図10(b)に示すように、「待ち
B」では、対称記号「( )」、「〔 〕」、
「{ }」の外で、「}」というトークンを検出したら
処理を終了する。これは、既に読み込まれた「{」と対
をなす「}」を検出するために使われる。また、図10
(c)に示すように、「待ちC」は、対称記号
「( )」、「〔 〕」、「{ }」の外で、「;」と
いうトークンを検出したら処理を終了する。
【0051】図11に、図7中の各状態において検出さ
れたトークン列と、それが宣言であるか関数定義である
かの対応を図示する。図12に、本発明の別の実施例を
図示する。図中、1は本発明に係るプログラム解析装置
であって、Cソースプログラムをトークンに分解するこ
となく、文字を単位として順次入力する構成を採って、
入力ソースプログラム部分が宣言か関数定義かを判定す
るよう処理するものである。2aはフィルター処理部で
あって、入力文字列中より、対称記号内部の出力を抑止
し、名前を認識してまとめて出力し、また、数値定数を
認識して出力を抑止し、その他の特殊文字はその都度1
文字ずつ出力するものである。図中に示すDD検出処理
部10以下の処理は図1に示すものと同じである。
【0052】図12に示すモード指定は、フィルター処
理部2aのモードを切り換えるもので、DD検出処理部
10が「typedef 」という名前を検出した場合に、続い
て起動される型定義処理部14が指示する。その後は、
フィルター処理部2aを通して、ソースプログラムのす
べての文字がそのまま型定義処理部14に渡される。型
定義処理部14は、通常のCコンパイラの解析処理を行
い、「typedef 」以下の宣言を解析し定義型名を登録す
る。その後、フィルター処理部2aのモードを元(通常
モード)に戻す。
【0053】図13に、ディジタル計算機上で実現した
図12の実施例の詳細構成を図示する。図中、30aは
フィルタープログラムで、フィルター処理部2aの機能
を処理するものである。フィルター処理部2aの出力
は、文字情報として、名前や特殊文字毎にプログラム解
析プログラム31に渡される。図中に示すプログラム解
析プログラム31以下の処理は図2に示すものと同じで
ある。フィルターには、モードとして通常モードと透過
モードとがあり、透過モードでは、「{」等の対称記号
に属する特殊文字も出力される。
【0054】図14に、フィルタープログラム30aの
入出力情報を図示する。解析対象となるプログラムは、
Cソース文字情報として入力される。これを内部で対称
記号、名前、数値定数、空白類、特殊文字に分類し、そ
のうち最外の対称記号と名前と特殊文字を出力する。こ
こで、名前とは、識別子や定義型名であり、特殊文字と
は、+− .等の演算子である。
【0055】次に、フィルタープログラム30aの機能
をより詳細に示す。フィルタープログラム30aは、C
ソースの文字を先頭から順に出力し、特殊文字と名前を
出力する。
【0056】 * 対称記号対〔 ..〕、
{ ..}、”..”、’..’の内部の出力を抑止す
る。 * 下線か英字で始まり、下線と英数字が続く範囲を名
前として1回にまとめて出力する。
【0057】 * 数字で始まり、.+−と英数字が続く範囲を数値定
数としてまとめ、出力を抑止する。 * 空白類(空白、タブ、改行文字等)は出力を抑止す
る。
【0058】* 特殊文字(英数字、下線、対称記号以
外)についてはそのまま出力する。 透過モードでは、対称記号の内部も出力する。なお、
( )は文法的には対称記号対であるが、DD検出処理
部10がその内部を必要とするためここでは除外する。
【0059】図15に、フィルタープログラム30aの
出力情報形式を図示する。名前の場合は、図15(a)
に示すように、種別を0として、その先頭文字の行番号
と名前の文字列が続く。特殊文字の場合は、図15
(b)に示すように、種別を1として、その行番号と文
字コードが続く。
【0060】次に本発明に係るプログラム解析装置の処
理の正当性について検証する。以下は文法的に正しいC
プログラムのみを扱う。一般にCソースプログラムは改
行文字などを含めて、全体が一つの文字列として格納さ
れているが、スキャナはその先頭からトークンとよばれ
る文字列の単位を取り出し、それを順にプログラム解析
装置に与えるものである。本発明の実施例としては、ほ
かにソースプログラムをスキャナを通さずに直接文字列
として入力する方法も可能である。
【0061】図7に示す前記実施例におけるプログラム
解析装置が入力トークン列を function.definition(関
数定義)と declaration(宣言)に類別し、かつその終
了位置を検出することを示そう。
【0062】この処理を繰り返すと、Cプログラムを構
成するすべての function.definitionと declarationが
抽出できることになる。トークンには、たとえば(,)
などの特殊記号や、if, else, for などの予約語、プロ
グラマが定義した変数名、関数名、数値定数、文字定数
などがある。トークンとトークンの間に、空白類とよば
れる文字が存在した場合、それはスキャナによって除去
される。C言語でいう文字定数( '.')や文字
列("..." )はスキャナによって一つのトークンとして
出力される。そのため、本発明の実施例では引用符 'や
"がトークンとして現れることはない。
【0063】ただし、スキャナを使わない方法において
は、それらは対称記号として扱う必要がある。はじめ
に、プログラム言語に関する一般論を述べる。
【0064】以下、言語は文脈自由言語であって曖昧で
ないものとする。C言語はこの条件を満足する。生成規
則、文脈自由文法、終端記号、非終端記号、開始記号、
解析木などの定義は省略する。これらの用語について
は、たとえば「コンパイラ(A.V.エイホ、J.D.
ウルマン著、土居範久訳、培風館発行、初版1986年
3月30日発行)」を参照されたい。
【0065】C言語の生成規則は「プログラミング言語
C 第2版(カーニハン、リッチー著、石田晴久訳、共
立出版株式会社発行、初版1989年6月15日発
行)」(以下、これをK&Rと呼ぶ)の付録Aに示され
ている。以後使用する記号はこれに基づいている。
【0066】スキャナは文字定数 '.'をトークン const
ant として、また文字列 "..."をトークン string とし
て分類する。プログラム解析装置はそれぞれを constna
t, string として認識し、その内容は使用しない。
【0067】以下、トークンと終端記号は同じ意味であ
る。 定義 終端記号と非終端記号を合わせて記号とよぶ、記号から
なる列を文形式という。 定義 A:γを生成規則とし、αおよびβを任意の文形式とす
ると、文形式αAβに対してこの生成規則(文法規則と
もいう)が適用できて、 αAβ⇒αγβ である。生
成規則の適用を順にくりかえして α1 ⇒α2 ⇒ ・・
・⇒αn となるならば、α1 からαn 導出されるとい
う。また上のような系列 α1 ⇒α2 ⇒・・・⇒αn
導出あるいは導出系列という。一つ一つの αi ⇒α
i+1 導出ステップという。 注. 記号:の左を左辺、右を右辺とよぶ。
【0068】文脈自由言語の場合、左辺は一つの非終端
記号、右辺は文形式である。同じ左辺を持つ規則が複数
存在することもある。 記号:の代わりに→を使うことも多い。
【0069】一つの導出ステップには一つの規則が適用
されている。 例 A:abc が生成規則(の一つ)であるとき、 pAqr⇒pabcqr である。ここでa,b,c,
p,q,rは記号である。
【0070】予約語とは、プログラミング言語において
あらかじめ定義された、固定した意味をもつ名前であ
る。たとえば if, struct, unionなどはC言語の予約語
である。以下、綴りが固定しているという意味で予約語
はすべて大文字で、 IF, STRUCT, UNIONなどのように示
す。一方、プログラマがその内容を自由に定義できるも
のは小文字で示した。また、非終端記号も translatio
n.unit などのようにすべて小文字で示した。また iden
tifier (識別子)や constant (定数)などは、プロ
グラマが内容を定義できるという意味で小文字で示し
た。しかしこれらは本実施例では終端記号として扱う。 定義 開始記号より導出される終端記号列をという。
【0071】C言語においては、開始記号は translati
on.unit である。文法的に正しいCプログラムは一つの
文である。 定義 終端記号の対(xi,i )(i=1,,n)からなる集合であ
って、xi とyi をすべて集めたとき重複するものがな
く、かつ、次の「対称記号対である条件」を満たすと
き、それらの対を対称記号対という。またxi 左対称
記号、yi 右対称記号という。またそれらを単に対称
記号ともいう。 [対称記号対である条件]xi およびyi (j=1,,n)は
規則の右辺に現れるときは同時に現れ、かつその規則は
次の形をしている。
【0072】B:αxi βyi γ ここで、Bは非終端記号、α,β,γはいずれもxj
j (j=1,,n)を含まない文形式である。このような形
式の規則をB型とよび、右辺に対称記号を含まない規則
A型とよぶことにする。
【0073】 A:α (A型) C言語において{ と }、( と )、[ と ]は
対称記号対である。 定義 2つの対称記号xi とyi が文α上で対応するとは、開
始記号からαへのある導出において、それらが同じステ
ップで生成されたものであることをいう。つまり、xi
とyi がそこで適用された規則の右辺に存在したもので
あることをいう。
【0074】従って、対応する対称記号の一方は左対称
記号、他方は右対称記号である。以下、xi とyi を並
べて示した場合、とくに断らなければxi を左対称記
号、yi を右対称記号とする。 補題1 任意の非終端記号より導出される終端記号列において、
最初(最も左)に現れる対称記号は左対称記号である。 証明 非終端記号より終端記号列への導出系列を考える。対称
記号に関する仮定より、その上の各導出ステップにおい
て、xi かyi が新たに現れるとすれば同時に、かつx
i がyi の左方に現れる。一方、導出の定義から明らか
なように、すべての導出ステップは以前の終端記号を消
去せず、かつそれらの順序を保存する。従って一旦導出
されたxi とyi の前後関係は変わらない。従って終端
記号列上最初に現れるのはいずれかのxi つまり左対称
記号である。■ 補題2 任意の非終端記号より導出される終端記号列において、
対称記号xi とこれに対応する対称記号yi よりそれぞ
れ解析木上で上(根の方)に枝を辿っていくと、あるノ
ードで合流するが、それらのxi とyi はそのノードの
子である。 証明 一方のトークンxi の親ノードをNとすると、Nにおい
て適用された規則によってこのxi が生成されたことに
なる。対応の定義から、他方のトークンyi も同じ規則
によって生成され、従ってNの子である。よってxi
i より上に辿るとNで合流し、xi とyi はともにN
の子である。■ 系 任意の非終端記号より導出される終端記号列において、
対応するxi とyi がそれぞれ異なる非終端記号の子孫
であることはない。
【0075】たとえば、a⇒..b..c..⇒..xi ..
i .. でxi とyi が対応し、かつそれぞれが非終端
記号b,cの子孫であることはない。 定義 カウンタ処理 入力:終端記号列とその上の一つのトークン位置 処理:はじめ、内部のカウンタを0とする。与えられた
トークン位置(開始トークン位置)から、その位置のト
ークンを含めてトークンを順に右に見ていき、もし左対
称記号を見たらカウンタを+1し、右対称記号を見たら
−1する。これを入力列の最後まで続ける。 とくに開
始トークン位置を示さない場合は、入力の先頭から行う
ものとする。 補題3 対称記号を含まない文形式αより導出された終端記号列
ωに対して、ωの中の任意の左対称記号xi よりカウン
タ処理を開始した場合、xi に対応する対称記号はその
後カウンタ値が最初に0に戻ったときの記号である。 証明 3段階に分けて証明する。 [1]対称記号を含まない文形式αより導出された終端
記号列ωに対して、ωの先頭よりカウンタ処理を行う
と、ωの最後ではカウンタ値は0となる。
【0076】カウンタ処理の定義から明らかなように、
ωの最後におけるカウンタの値はω中の左対称記号の個
数から、右対称記号の個数を引いたものに等しい。αよ
りωへの導出の各ステップにおいて適用された規則はA
型かB型かのいずれかである。A型の場合はその前後で
左・右対称記号の数は変わらない。B型の場合は左対称
記号と右対称記号が1個ずつ増える。従って導出の各ス
テップにおいて左対称記号と右対称記号の個数の差は不
変である。はじめαに含まれる左・右対称記号の個数は
ともに0個で等しかった。従ってωにおいても左・右対
称記号の個数は等しい。従ってωに対してカウンタ処理
を行えば結果は0となる。 [2]上のωに対するカウンタ処理の途中において、カ
ウンタ値は常に正か0である。
【0077】αよりωへの導出ステップ数nに関する帰
納法で証明する。n=0 の場合、αとωは一致し、α
が終端記号列となり、仮定から対称記号を含まず、した
がってカウンタ値は最後まで常に0である。
【0078】n>=0の場合にカウンタ値が常に正が0
であると仮定して、n+1の場合にもそうであることを
示そう。αよりωへの導出において最初に適用されたB
型の規則を次のものとする。
【0079】B:pxi qyi r ここでp,q,rは対称記号を含まない文形式である。
非終端記号p,q,rより、ω中の対応する部分への導
出ステップ数はいずれもn以下であるから、[1]およ
び帰納法の仮定よりp,q,rに対するカウンタ処理の
最後の値は0で、途中の値は正か0である。
【0080】pxi qyi rより導出されたωに対して
カウンタ処理を行うと、pの部分において正か0、xi
において1となり、qの部分においては単独にqより導
出されたωの部分を入力した場合のカウンタ値に常に1
を加えた値を経過して最後に1となり、yi において1
から0となり、rの部分において常に正か0を経過す
る。結局ωにおいてカウンタ値は常に正か0である。 [3]補題3の証明 αよりωへの導出の中で、xi を生成した導出ステップ
で適用された規則は次の形である。
【0081】B:pxi qyi r ここでp,q,rは対称記号を含まない文形式である。
このxi よりカウンタ処理を開始すると、xi において
カウンタが0から1となり、以後単独にqを入力したと
きのカウンタ値に常に1を加えた値を経過する。qにお
いては[1],[2]よりカウンタ値は1以上で最後に
1となる。そこでxi qyi においてカウンタ値が最初
に0に戻るのはyi においてである。これはxi に対応
する対称記号であった。■以上から、カウンタ処理によ
って、文ω上の指定された左対称記号xi に対応する対
称記号yi を求めることができることがわかる。以後、
i ..yi と表記した場合、終端記号列上でxi から対
応するyi までの範囲を両端を含めて意味するものとす
る。注.終端記号列を意味することが文脈上明らかな場
合、非終端記号あるいは文形式によって、それより導出
される終端記号列を表すことがある。また文形式中の非
終端記号によって、その文形式より導出された終端記号
列の中の、その非終端記号より導出された部分を表すこ
とがある。
【0082】declaration と言った場合、declaration
より導出される終端記号列を意味する。 補題4 Cプログラムは function.definitionと declarationか
らなる並びである。 証明 一つのCプログラムは開始記号 translation.unit より
導出された文である。
【0083】translation.unit を左辺に持つ規則は以
下のとおりである。 translation.unit: external.declaration translation.unit external.declaration ゆえに、Cプログラムは external.declaration の並び
である。また external.declaration を左辺に持つ規則
は以下のとおりである。
【0084】external.declaration: function.definition (1) declaration ゆえに、Cプログラムは function.definitionとdeclar
ation からなる並びである。■ 注.上の規則(1) は、同じ左辺を持つ2つの規則をまと
めて示したものである。すなわち(1) は次の2つの規則
と同じである。 external.declaration : function.definition external.declaration : declaration 以下に、本発明のプログラム解析装置の実施例が図7に
示す各状態から出発して、以下の各規則の右辺を入力し
た場合に、それがどのような状態遷移をするかを示す。
またそれを証明する個所を補題nnとして示す。そのあ
と、これらの補題を順に証明する。 function.definition : declaration.specifiersopt declarator compound.statement DD検出処理──────→ DD ───識別処理──→{───待ちB ─→} 補題19 declaration.specifiersopt declarator declaration.list compound.statement DD検出処理────→ DD ───識別処理─→DS─待ちA →; {─待ちB →} 補題19 declaration.list : declaration declaration.list declaration 待ちA ─────────────→補題5 識別処理──→DS─待ちA ────→(;) 「次」補題18 declaration : declaration.specifiers ; DD検出処理───────────→; 補題15 識別処理──→DS──待ちA ─→(;) 「次」補題16 待ちA ───────────→(;) 「次」補題17 declaration.specifiers init.declarator.list ; DD検出処理───────→DD─識別処理───────→; 補題15 DD検出処理───────→DD─識別処理─→=─待ちC →; 補題15 DD検出処理───────→DD─識別処理─→, ─待ちC →; 補題15 識別処理──→DS───待ちA ─────────→(;) 「次」補題16 待ちA ────────────────────→(;) 「次」補題17 declaration.specifiers : DD検出処理────────→補題13 DD検出処理──────→ TD 補題13 識別処理→DS─待ちA ───→補題14 待ちA ──────────→補題5 init.declarator.list : init.declarator DD検出処理───────────→ DD 補題11 DD検出処理→DD─識別処理→=─待ちC →補題11 待ちA ───────────────→補題5 待ちC ───────────────→補題6 init.declarator.list , init.declarator DD検出処理→DD─識別処理─→, ─待ちC ───→補題12 DD検出処理→DD─識別処理─→=─待ちC ───→補題12 待ちA ───────────────────→補題5 init.declarator : declarator DD検出処理──────→ DD 補題9 待ちA ──────────→補題5 待ちC ──────────→補題6 declarator = initializer DD検出処理→DD─識別処理→=─待ちC ─→補題10 待ちA ────────────────→補題5 待ちC ────────────────→補題6 declarator : pointeropt direct.declarator DD検出処理───────→ DD 補題9 待ちA ───────────→補題5 待ちC ───────────→補題6 pointer : DD検出処理─────→補題7 待ちA ───────→補題5 待ちC ───────→補題6 direct.declarator : DD検出処理───────→ DD 補題8 待ちA ───────────→補題5 待ちC ───────────→補題6 注. 規則の右辺を省略したものもある。その場合は左辺
を入力するものとする。
【0085】「DD検出処理」や「識別処理」などは図7
に示す状態の一つであり、またそこではそれぞれ同じ名
前の部分処理が起動される。 DD は direct.declaratorの略、 DS は declaration.sp
ecifiers の略である。
【0086】***opt はその項目が存在する場合と存在
しない場合が可能なことを示す。すなわち、存在する場
合の規則と存在しない場合の規則をひとつまとめて示し
たものである。
【0087】a→DD, a→DSなどは状態aにおいてDDや
DSをそれぞれ検出することを示す。 待ちA ─→(;) 「次」は、「待ちA 」処理が入力列の最
後の記号である;を読んだあと、その中の途中の状態
「次」で停止することを意味する。
【0088】最後が→で終わっている場合は、検出対象
トークンを検出しないうちに入力トークン列の終わりに
来ることを示す。補題の順序は原則として解析木の先端
(葉)の方を先にしてある。
【0089】以上で「ωを読み飛ばす」とは、処理が終
了せずに入力トークン列ωを最後まで読み、かつ最後の
状態が初期状態と同一となり、次の入力位置はωの次と
なることを意味する。 仮定1 function.definition の右辺における declaration.spe
cifiers には TYPEDEFは含まれない。
【0090】これは上記カーニハン、リッチーの本の付
録Aには示されていないが設ける。実用にされているコ
ンパイラはこれに沿っているようである。型定義の意味
からも容認できることである。 補題5 「待ちA 」は次のトークン列を読み飛ばす。 (1) declaration.specifiers (2) init.declarator.list init.declarator declarator initializer pointer direct.declarator 動作:待ちA ───────→ 証明 待ちA は図10に示す状態遷移図から明らかなように、
対称記号対(..)[..]{..}の外部において;{ と
いうトークンの並びを検出したときのみ終了する。も
し、対称記号([{ のいずれかを読むと、カウント処
理によって対応する )]}まで読み飛ばす。この読み
飛ばしは補題2 により、一つの非終端記号より導出され
る終端記号列の範囲を出ない。従って入力トークン列の
中から右端を越えてまで読み飛ばすことはない。その他
のトークンは一つ一つ読み飛ばされる。そこで、上記各
非終端記号から導出されるトークン列の中に;{ の列
が含まれないことを示せばよい。 (1) declaration.specifiers を左辺とする規則は次の
とおりである。
【0091】 declaration.specifiers : storage.class.specifier declaration.specifiersopt type.specifier declaration. specifiersopt type.qualifier declaration. specifiersopt 従って declaration.specifiers を構成する終端記号の
集合は storage.class.specifier, type.specifier, ty
pe.qualifierを構成する終端記号の集合の和集合であ
る。それらはC言語の文法規則から次のとおりであるこ
とが容易にわかる。
【0092】 これらの中に、対称記号内を除くと;は現れない。よっ
て declaration.specifiers は待ちA によって読み飛ば
される。 注. S.U.E は、struct、union 、enumのいずれかに置き
換えて読むべきものである。 (2) 先に示した規則、あるいはK&Rからわかるよう
に、init.declarator.listを左辺とする規則の右辺に i
nit.declaratorが含まれ、これを左辺とする規則の右辺
に declarator と initializerが含まれ、 declarator
を左辺とする規則の右辺に pointerと direct.declarat
orが含まれる。
【0093】ゆえに、init.declarator.listを構成する
終端記号の中から、 init.declarator, declarator, in
itializer, pointer, direct.declarator が構成でき
る。よって、init.declarator.listを構成する終端記号
からなる任意の列が逐次読み飛ばされることを示せば、
上のあとの各非終端記号が読み飛ばされることが言え
る。
【0094】init.declarator.listより導出される終端
記号は、対称記号内を除くと次のトークンから構成され
る。これは機械的に得られるので詳細は省略する。その
手続きを簡単に述べると、はじめ終端記号の集合Aを空
とし、非終端記号の集合Bをinit.declarator.list た
だ一つからなる集合とする。Bの元を一つ取り出し、そ
れを左辺とする規則をすべて集め、それらの右辺に含ま
れる終端記号と非終端記号をそれぞれAとBに加える。
ただし対称記号に挟まれる記号は加えない。そして同じ
処理を繰り返す。一度使用した規則は使用しないことに
する。この手続きは有限で終了し、最後に得られた終端
記号の集合Aが求めるものである。こうして次の結果を
得る。
【0095】init.declarator.listを構成する終端記
号: * = /= %= += −=<<= >>= * CONST VOLATILE identifier ( )[ ]=, &=  ̄
= |= constant string. −> ++ −− &
+ − ¬ ! SIZEOF / % << >>< >
<= >= == !=  ̄ | && || ? :
{ } この中に;は含まれない。従って「待ちA」において上
記(2) の各々は読み飛ばされる。■ 補題6 「待ちC 」は次のトークン列を読み飛ばす。
【0096】 動作:待ちC ─────→ 証明 待ちC は図10に示すように対称記号
対(..)[..]{..}の外部において;を検出したとき
のみ終了する。その読み飛ばし動作は待ちA と同じであ
る。
【0097】補題6 の証明から明らかなように、上に示
した init.declarator以下Bの各記号から導出される終
端記号列の中に、その対称記号外に;が現れることはな
い。よって待ちC はBのそれぞれを読み飛ばす。■ 補題7 DD検出処理は pointerを読み飛ばす。 入力:pointer 動作:DD検出処理───→ 証明 DD検出処理は図8に従ってはじめ対称記号対{ },
[ ]の中を除いて、;か、STRUCT,UNION,ENUM の直後
に位置しないのidentifier、または(、または TYPEDEF
を検出しようとする。
【0098】pointer より導出される終端記号列を構成
する終端記号は、補題5 に示したのと同じ方法で、以下
のトークンであることがわかる。 * CONST VOLATILE 従って pointerは *, CONST, VOLATILE からなる列であ
る。これらの記号はDD検出処理の定義から初期状態であ
る「待ち」の状態で逐一読み飛ばされる。従って point
erは読み飛ばされ、最後の状態は「待ち」となり、次の
読み込み位置は入力列の直後となる。■ 補題8 DD検出処理が direct.declaratorを入力するとその最後
まで読み、「DD検出」により終了する。 入力:direct.declarator 動作:DD検出処理───→DD 証明 direct.declarator を左辺とする規則はK&Rにより次
のとおりである。 direct.declarator : identifier ( declarator ) direct.declarator [ constant.expression opt] direct.declarator ( parameter.type.list ) direct.declarator ( identifier.listopt ) ゆえに、direct.declarator から導出される終端記号列
は先頭が identifierか(..)であり、続く部分
は[..]と(..)からなる列である。
【0099】DD検出処理の定義から、( を入力した場
合はレベル処理に移行して、対応する )を探し、続い
て経過処理に移行し、続くトークンxを読み、xが (
か[であればレベル処理によって対応する )あるいは
]を求め、次のトークンxを読んでこれを続ける。x
が( でも[ でもなければトークン位置を一つ戻して
「DD検出」として終了する。初期状態で identifier を
入力した場合は続くトークンxを読み、以下同様の処理
を行う。従ってDD検出処理は direct.declaratorを入力
するとその最後まで読み、「DD検出」により終了する。
■ 補題9 DD検出処理が declarator を入力すると、その最後まで
読み、「DD検出」により終了する。 入力:declarator 動作:DD検出処理────→DD 証明 declaratorを左辺とする規則は次のとおりである。 declarator : pointeropt direct.declarator 補題7 により、DD検出処理はpointer を読み飛ばし、続
いてdirect.declarator の先頭より読む。補題8 によ
り、DD検出処理はその最後まで読み、「DD検出」により
終了する。■ 補題10 DD検出処理が次のトークン列を入力した場合、DDを検出
し、つづいて起動される識別処理が=を検出し、つづい
て起動される「待ちC 」がその最後まで読み飛ばす。 入力:declarator=initializer 動作:DD検出処理→DD─識別処理→=─待ちC → 証明 DD検出処理は始めにdeclaratorを入力するので、補題9
により、declaratorの最後まで読み、「DD検出」により
終了する。つづいて起動される識別処理が=を入力する
ので、図9に示す識別処理の定義からそこで=検出によ
り処理を終える。次に図7に従って「待ちC 」が起動さ
れる。
【0100】これは initializerを入力することになる
が、補題6 より、これは initializerの最後まで読み飛
ばす。■ 補題11 DD検出処理が init.declaratorを入力すると、次のいず
れかがおこる。 DD検出処理がその最後まで読んでDD検出により終了す
る。 DD検出処理がDD検出により終了し、つづいて起動され
る識別処理が=を検出して終了し、つづいて起動される
「待ちC 」が init.declaratorの最後まで読み飛ばす。 入力:init.declarator 動作:DD検出処理→DD DD検出処理→DD─識別処理→=─待ちC → 証明 init.declarator を左辺とする規則は次のとおりであ
る。 init.declarator : declarator (1) declarator=initializer (2) (1)の場合、補題9 により本補題のがおこる。
【0101】(2)の場合、補題10により本補題のがお
こる。■ 補題12 DD検出処理が次を入力すると次の, のいずれかがお
こる。 入力:init.declarator.list , init.declarator DD検出処理がDDを検出して終了し、つづいて起動され
る識別処理が ,を検出して終了し、つづいて起動され
る「待ちC 」がその最後まで読み飛ばす。 DD検出処理がDDを検出して終了し、つづいて起動され
る識別処理が=を検出して終了し、つづいて起動される
「待ちC 」がその最後まで読み飛ばす。 入力:init.declarator.list , init.declarator 動作:DD検出処理→DD─識別処理→, ─待ちC → DD検出処理→DD─識別処理→=─待ちC → 証明 init.declarator.listを左辺とする規則は次のとおりで
ある。 init.declarator.list : init.declarator init.declarator.list , init.declarator 従って init.declarator.list は一つの init.declarat
orからなるか、それに,と init.declaratorからなる並
びが続くかのいずれかである。従って本補題の入力は i
nit.declaratorに ,と init.declaratorからなる並び
が続いたものである。したがってそれは init.declarat
or.list と一致する。
【0102】はじめにDD検出処理は init.declaratorを
入力する。補題11により、そこに示したかがおこ
る。続く入力列は ,と init.declaratorの繰り返しで
ある。
【0103】の場合、DD検出処理後に図7に従って起
動される識別処理がこれを入力することになる。, を入
力すると識別処理が終了し、続いて起動される「待ちC
」がinit.declaratorと ,からなる部分を入力するこ
とになる。補題6 により init.declaratorは読み飛ばさ
れ、また図10に示すように「待ちC 」の定義から,も
読み飛ばされる。つまり「待ちC 」はこれらを読み飛ば
す。従ってが起こる。
【0104】の場合、既に起動されている「待ちC 」
が ,と init.declaratorの繰り返しを入力することに
なるが、同様にして「待ちC 」はそれを読み飛ばす。従
ってが起こる。■ 系 DD検出処理が init.declarator.list を入力する
と、補題11のまたは、または補題12のまたはが
おこる。 補題13 DD検出処理は TYPEDEFを含まない declaration.specifi
ers を読み飛ばす。また、TYPEDEF を含む declaratio
n.specifiers を入力すると、TD検出により終了する。 入力:declaration.specifiers 動作:DD検出処理─────→ DD検出処理─────→TD 証明 図8に示す通りDD検出処理の定義から、次の4つのトー
クン以外は順次読み飛ばされる。
【0105】TYPEDEF identifier ( ; また、 identifier も STRUCT, UNION, ENUM(今後、こ
れらを S.U.Eと表すことにする)に続く場合は読み飛ば
される。
【0106】declaration.specifiersより導出される終
端記号列は、補題5の証明で示したように次からなる並
びの形をしている。 DD検出処理において、はじめの状態は「待ち」である。
上の個別トークン AUTO ... VOLATILEのうち TYPEDEF以
外はDD検出処理の定義から、「待ち」の状態において一
個ずつ読み飛ばされる。
【0107】また、それ以外であるトークン列Aも一つ
一つ読み飛ばされ、「待ち」の状態に戻り、またその次
の読み込み位置はその直後となる。なぜなら、 S.U.E identifier {..}を入力した場合 「待ち」状態で S.U.Eを入力すると図8の「次」の状態
に移行する。「次」でidentifier を入力すると、それ
は名前に属するので元の「待ち」状態に戻る。次に{
を入力すると、レベル処理によって対応する }まで読
み飛ばされ、「待ち」状態に戻る。この }は補題2 に
よって先の{ とともに非終端記号 declaration.speci
fiers から同時に導出されたものである。従って S.U.E
identifier {..}は読み飛ばされ、「待ち」に戻る。
次の読み込み位置は }の次である。 S.U.E{..}を入力した場合 「待ち」状態で S.U.Eを入力すると「次」の状態に移行
する。「次」で{ を入力すると、トークン位置を前に
戻したあと「待ち」の状態に戻る。「待ち」では次の読
み込みによって再び同じ{ を読むので、定義によって
レベル処理に移行する。そこで対応 }まで読み飛ばし
たのち「待ち」に戻る。従って S.U.E{..}は読み飛ば
され、「待ち」に戻る。次の読み込み位置は }の次で
ある。 S.U.E identifier X を入力した場合(但しX は{
以外のトークンである) 「待ち」状態で S.U.Eを入力すると「次」の状態に移行
する。「次」で identifier を入力すると、元の「待
ち」状態に戻る。次にX を入力すると、トークン位置を
一つ前に戻したあと「待ち」の状態に戻る。次の読み込
みトークンはX である。
【0108】以上の〜から、「待ち」状態において
上の3つのトークン列が読み飛ばされることが言えた。
また、その直後の読み取り位置はそのトークン列に続く
位置である。
【0109】以上から、TYPEDEF を含まない declarati
on.specifiers はDD検出処理によって読み飛ばされ、最
後に「待ち」状態となり、次の読み込み位置はその直後
となる。
【0110】TYPEDEF を含む declaration.specifiers
を入力した場合は、上に示したトークンまたはトークン
列Aを逐次読み進むうちに、TYPEDEF を読むことになる
ため、そこでTD検出として終了する。■ 補題14 識別処理が declaration.specifiers を入力すると、DS
検出により終了し、続いて起動される「待ちA 」がその
最後まで読み飛ばす。 入力:declaration.specifiers 動作:識別処理─→DS─待ちA ─→ 証明 補題5の証明で示したように、 declaration.specifier
s は次のトークンおよびトークン列の並びである。
【0111】 識別処理は上の各トークンまたはトークン列Aの先頭
(STRUCT UNION ENUM )を入力すると、図9に示したよ
うに、 ; ,={ 以外であるため、DS検出によって終了
する。次に起動される待ちA は残りの部分を入力する
が、これもやはり上の各トークンまたはトークン列A の
並びであるため、 declaration.specifiersであり、補
題5 によってその最後まで読み飛ばされる。■ これがDS検出の名前の由来である。つまり、 declarati
on.specifiers を構成するトークンを検出対象としても
よいが、上記以外のトークンを読んだらDS検出としてよ
いのである。 補題15 プログラム解析装置が declarationを入力すると、次の
いずれかを認識する。 (a) ; (b)DD ; (c)DD , ; (d)DD = ; 注. 図7に示した各部分処理の検出結果の系列を、プロ
グラム解析装置の認識とよぶ。 証明 declaration を左辺とする規則は次のとおりである。 declaration : declaration.specifiers ; (1) declaration.specifiers init.declarator.list ; (2) プログラム解析装置では図7に従って始めにDD検出処理
が起動される。DD検出処理が(1) を入力した場合、補題
13によって declaration.specifiers を読み飛ばす。次
に読まれるトークンは;で、DD検出処理はこれを検出す
る。従って(a) の系列を認識する。 (2) を入力した場合、補題13によって、DD検出処理は d
eclaration.specifiersを読み飛ばす。続く入力は ini
t.declarator.list ; である。補題12の系により、 ini
t.declarator.list を入力したとき次の, , ,
のいずれかがおこる。すなわち、 DD検出処理がその最後まで読んでDD検出により終了す
る。 DD検出処理がDD検出により終了し、つづいて起動され
る識別処理が=を検出して終了し、つづいて起動される
「待ちC 」が init.declaratorの最後まで読み飛ばす。 DD検出処理がDDを検出して終了し、つづいて起動され
る識別処理が ,を検出して終了し、つづいて起動され
る「待ちC 」がその最後まで読み飛ばす。 DD検出処理がDDを検出して終了し、つづいて起動され
る識別処理が=を検出して終了し、つづいて起動される
「待ちC 」がその最後まで読み飛ばす。 の場合、DD検出ののち、図7に従って次に起動される
識別処理が;を検出して終了する。従って認識は DD ; となる。これは(a) にあたる。 の場合、「待ちC 」が;を入力するので、これを検出
して終了する。この場合の認識は DD = ; となる。これは(b) にあたる。 の場合も同様にして、認識は DD , ; となる。これは(c) にあたる。 の場合も同様にして、認識は DD = ; となる。これは(d) にあたる。■ 補題16 識別処理が declarationを入力すると、DSを検出し、続
いて起動される「待ちA 」がその最後まで読み、最終状
態は「待ちA 」の中の状態「次」となる。 入力:declaration 動作:識別処理─→DS──待ちA ─→(;) 「次」 証明 declaration を左辺とする規則は次の通りである。
【0112】 declaration : declaration.specifiers ; declaration.specifiers init.declarator.list ; の場合 判別処理が declaration.specifiers を入力すると、補
題14より、識別処理がDS検出によって終了し、図7に従
って続いて起動される「待ちA 」が補題5の証明から分
かるようにその最後まで読み飛ばす。続いて「待ちA 」
はの最後である;を入力し、「待ちA 」の定義から、
これを読んで「待ちA」の中の状態「次」となる。 の場合 判別処理が declaration.specifiers を入力すると、補
題14より、識別処理がDS検出によって終了し、続いて起
動される「待ちA 」がその最後まで読み飛ばす。続いて
「待ちA 」が init.declarator.list を入力するが、補
題5 により、「待ちA 」はその最後まで読み飛ばす。続
いて「待ちA 」はの最後である;を入力し、これを読
んで状態「次」となる。■ 補題17 「待ちA 」が declarationを入力すると、その最後まで
読み、その中の状態「次」となる。 入力:declaration 動作:待ちA ──→(;) 「次」 証明 declaration を左辺とする規則は次のとおりである。
【0113】 declaration : declaration.specifiers ; declaration.specifiers init.declarator.list ; , のいずれの場合も、「待ちA 」は始めに declara
tion.specifiers を読む。
【0114】declaration.specifiersは補題5 に示した
ように、次の終端記号および終端記号列の並びである。 「待ちA 」は;{ というトークンの並びを読んだとき
にのみ終了する。また;を読んだ直後にのみ状態「次」
となる。上のことから、「待ちA 」は declaration.spe
cifiers をその最後まで読み、最後の状態は初期状態と
同じである。の場合、「待ちA 」は次に;を読む。従
って「次」の状態で読み終わる。の場合、「待ちA 」
は次に init.declarator.list を読む。補題5 より、
「待ちA 」はそれを読み飛ばす。続いて「待ちA 」は;
を読むので、「次」の状態で読み終わる。■ 補題18 識別処理が declaration.list を入力すると、DS検出に
より終了し、続いて起動される「待ちA 」がその最後ま
で読み、その中の状態「次」となる。 入力:declaration.list 動作:識別処理──→DS──待ちA ──→(;) 「次」 証明 declaration.listを左辺とする規則は次のとおりであ
る。
【0115】declaration.list : declaration declaration.list declaration 従って、declaration.listは一つ以上の declarationの
並びである。
【0116】識別処理がはじめ declarationを入力する
と、補題16により、DS検出により終了し、続いて起動さ
れる「待ちA 」がその最後まで読み、その中の状態
「次」となる。
【0117】declaration.listがただ一つの declarati
onからなる場合はこれで入力の終わりとなるので、本補
題は成立する。declaration.listが複数の declaration
からなる場合は、「待ちA 」がその中の状態「次」よ
り、続く declarationを読む。
【0118】declaration の先頭に{ が来ることはな
い。なぜなら、declaration を左辺とする規則は次のと
おりである。 declaration : declaration.specifiers ; declaration.specifiers init.declarator.list ; したがって declarationの先頭は declaration.specifi
ers の先頭からなる。declaration.specifiersは補題5
に示したように、次の終端記号および終端記号列の並び
である。
【0119】 それらの先頭に{ は含まれていない。従って declara
tion.specifiers の先頭に、従って declarationの先頭
に{ が来ることはない。
【0120】従って、「待ちA 」の状態「次」において
declarationの先頭を読むと、トークン位置を戻し、そ
の初期状態に戻る。以後、「待ちA 」は同じ declarati
onを先頭から読む。
【0121】補題17より、「待ちA 」が declarationを
入力すると、その最後まで読み、その中の状態「次」と
なる。こうして、さらに declarationが続くかぎり同じ
動作を行い、最後の状態は「次」となる。 補題19 プログラム解析装置が function.definitionを入力する
と、次のいずれかがおこる。 (a) DD検出処理がDD検出によって終了し、続いて起動さ
れる識別処理が{ を検出して終了し、続いて起動され
る「待ちB 」が }を検出して終了する。 (b) DD検出処理がDD検出によって終了し、続いて起動さ
れる識別処理がDS検出により終了し、続いて起動される
「待ちA 」が;{ を検出して終了し、続いて起動され
る「待ちB 」が }を検出して終了する。 入力:function.definition 動作:DD検出処理─→DD──識別処理─→{─待ちB →} DD検出処理─→DD──識別処理─→DS──待ちA ─→ ;{─待ちB →} 証明 function.definition を左辺とする規則は次のとおりで
ある。 function.definition ; declaration.specifiersopt declarator compound.statement declaration.specifiersopt declarator declaration.list compound.state ment プログラム解析装置では、初めDD検出処理が起動され
る。 の場合、DD検出処理はオプション項目である declara
tion.specifiers をもし入力すれば、補題13によりこれ
を読み飛ばす。
【0122】続いてDD検出処理は declarator を入力す
るが、補題9 により、その最後まで読み、DD検出により
終了する。続いて起動される識別処理が compound.stat
ement を入力するが、定義からその先頭の{ を検出し
て終了し、続いて「待ちB 」が起動される。 compound.
statement を左辺とする規則は次のとおりである。
【0123】compound.statement :{declaration.list
opt statement.listopt } このため、「待ちB 」はdeclaration.listopt statemen
t.listopt }の列を入力するが、ここで「待ちB 」は定
義により、カウンタ値を1としてからカウンタ処理を行
い、カウンタ値が0である状態で }を読んだときに終
了する。
【0124】「待ちB 」は declaration.list や state
ment.list の中の記号 }によって終了することはな
い。記号 }は右対称記号であるから、 declaration.l
ist より導出される終端記号列に含まれるとすれば、対
応する左対称記号がその中の左方に存在する。したがっ
てそれらの{ と }の間でカウンタ値は1以上であ
り、従って }を読んだときのカウンタ値は1以上であ
る。従って「待ちB 」は declaration.list の最後まで
読み飛ばす。また最後のカウンタ値は0である。 state
ment.list についても同様である。従って compound.st
atement の右辺の declaration.list や statement.lis
t を読み飛ばす。そして最後の }をカウンタ値0の状
態で読み、定義からそれを検出して終了する。
【0125】以上から、の場合、(a) がおこる。 DD{ } の場合、DD検出処理はオプション項目である declara
tion.specifiers をもし入力すれば、補題13によりこれ
を読み飛ばす。
【0126】つづいてDD検出処理が declarationを入力
するが、の場合と同様に、それを最後まで読んでDD検
出により終了する。続いて識別処理が起動され、 decla
ration.list を入力すると、補題18から、識別処理はDS
検出により終了し、続いて起動される「待ちA 」がその
最後まで読み、状態「次」となる。
【0127】つづいて「待ちA 」が状態「次」において
compound.statement を入力する。この先頭は{ であ
るから、「待ちA 」の定義からそれは終了する。続いて
起動される「待ちB 」がdeclaration.listopt statemen
t.listopt }の列を入力するが、と同様にしてその最
後の }を検出して終了する。■ 以上により、本発明に係るプログラム解析装置の処理の
正当性について検証することができた。
【0128】
【発明の効果】以上説明したように、本発明によれば、
C言語の文法規則に則して解析することなく、かつ、コ
ンパイラにより得られるシンボル情報を用いることな
く、Cソースプログラム内の指定された関数の開始位置
を求めることができるので、Cソースプログラム内の指
定された関数の開始位置を正確かつ高速に求めることが
できるようになるのである。
【図面の簡単な説明】
【図1】本発明の原理構成図である。
【図2】本発明の一実施例である。
【図3】トークン情報の説明図である。
【図4】関数定義一覧表のデータ構造の説明図である。
【図5】プログラム解析装置プログラムの実行するメイ
ンルーチン処理の処理フローの一実施例である。
【図6】プログラム解析装置プログラムの実行するメイ
ンルーチン処理の処理フローの一実施例である。
【図7】プログラム解析装置プログラムの実行する処理
フローの状態遷移図である。
【図8】DD検出処理の詳細な状態遷移図である。
【図9】識別処理の詳細な状態遷移図である。
【図10】待ち処理の詳細な状態遷移図である。
【図11】トークン列と判別結果例の説明図である。
【図12】本発明の別の実施例である。
【図13】本発明の別の実施例である。
【図14】フィルタープログラムの入出力情報の説明図
である。
【図15】フィルタープログラムの出力情報形式の説明
図である。
【符号の説明】 1 プログラム解析装置 2 スキャナ装置 10 DD検出処理部 11 識別処理部 12 終了位置検出部 13 定義型名一覧表 14 型定義処理部

Claims (9)

    【特許請求の範囲】
  1. 【請求項1】 Cソースプログラムを文字またはトーク
    ンを単位として入力する構成を採って、各Cソースプロ
    グラム部分が宣言か関数定義かを判別するよう処理する
    プログラム解析装置であって、 Cソースプログラム部分の{ }外において、直接宣言
    子または「;」の出現を検出するDD検出処理部(10)を
    備え、 上記DD検出処理部(10)が「;」を検出するときには、
    そのCソースプログラム部分を宣言と判定し、 一方、上記DD検出処理部(10)が直接宣言子を検出する
    ときにあって、該直接宣言子の次の入力が、「=」
    か「,」か「;」のいずれかの内の1つであることを検
    出するときには、そのCソースプログラム部分を宣言と
    判定するとともに、該直接宣言子の次の入力が、それ以
    外であることを検出するときには、そのCソースプログ
    ラム部分を関数定義と判定するよう処理することを、 特徴とするプログラム解析装置。
  2. 【請求項2】 Cソースプログラムを文字またはトーク
    ンを単位として入力する構成を採って、各Cソースプロ
    グラム部分が宣言か関数定義かを判別するよう処理する
    プログラム解析装置であって、 Cソースプログラム部分の{ }外において、直接宣言
    子または「;」の出現を検出するDD検出処理部(10)を
    備え、 上記DD検出処理部(10)が「;」を検出するときには、
    そのCソースプログラム部分を宣言と判定し、 一方、上記DD検出処理部(10)が直接宣言子を検出する
    ときにあって、該直接宣言子の中の最初の識別子の次が
    「(」であり、かつ、該直接宣言子に続く入力
    が、「,」か「;」であることを検出するときには、そ
    のCソースプログラム部分を宣言と判定するとともに、
    該直接宣言子に続く入力が、それ以外であることを検出
    するときには、そのCソースプログラム部分を関数定義
    と判定し、 更に、上記DD検出処理部(10)が直接宣言子を検出する
    ときにあって、該直接宣言子の中の最初の識別子の次が
    「(」以外であることを検出するときには、そのCソー
    スプログラム部分を宣言と判定するよう処理すること
    を、 特徴とするプログラム解析装置。
  3. 【請求項3】 請求項1または2記載のプログラム解析
    装置において、 DD検出処理部(10)は、Cソースプログラム部分の
    { }外において、「struct」、「union 」または「en
    um」の直後に位置しない識別子、または「(」、または
    「;」の出現を待ち、 Cソースプログラム部分の{ }外において、「struc
    t」、「union 」または「enum」の直後に位置しない識
    別子の出現を検出するときにあっては、該識別子に続く
    「( ..)」と「〔 ..〕」とからなる並びを読み
    飛ばしていって、その読み飛ばし部分の最後でもって直
    接宣言子の出現を検出し、 かつ、Cソースプログラム部分の{ }外において、
    「(」の出現を検出するときにあっては、該「(」の対
    となる「)」を検出して、該「)」に続く「(..)」
    と「〔 ..〕」とからなる並びを読み飛ばしていっ
    て、その読み飛ばし部分の最後でもって直接宣言子の出
    現を検出するよう処理することを、 特徴とするプログラム解析装置。
  4. 【請求項4】 請求項1または2記載のプログラム解析
    装置において、 DD検出処理部(10)は、Cソースプログラム部分の
    { }外において、「struct」、「union 」または「en
    um」の直後に位置しない識別子、または「;」の出現を
    待ち、 Cソースプログラム部分の{ }外において、「struc
    t」、「union 」または「enum」の直後に位置しない識
    別子の出現を検出するときにあっては、該識別子に続
    く、「)」と「( ..)」と「〔 ..〕」とからな
    る並びを読み飛ばしていって、その読み飛ばし部分の最
    後でもって直接宣言子の出現を検出するよう処理するこ
    とを、 特徴とするプログラム解析装置。
  5. 【請求項5】 請求項1ないし4記載のプログラム解析
    装置において、 DD検出処理部(10)が「;」を検出するときには、そこ
    までを1つの宣言と判定し、 一方、DD検出処理部(10)が直接宣言子を検出するとき
    にあって、該直接宣言子の次の入力が「;」であるとき
    には、そこまでを1つの宣言と判定し、 DD検出処理部(10)が直接宣言子を検出するときにあっ
    て、該直接宣言子の次の入力が「=」か「,」であると
    きには、それに続く対称記号外において出現する「;」
    を検出して、そこまでを1つの宣言と判定し、 DD検出処理部(10)が直接宣言子を検出するときにあっ
    て、該直接宣言子の次の入力が「{」であるときには、
    該「{」の対となる「}」を検出して、そこまでを1つ
    の関数定義と判定し、 DD検出処理部(10)が直接宣言子を検出するときにあっ
    て、該直接宣言子の次の入力が、「;」、
    「=」、「,」、「{」以外のものであるときには、そ
    れに続く対称記号外において出現する「;」と「{」と
    の連続対を検出し、該連続対中の「{」の対とな
    る「}」を検出して、そこまでを1つの関数定義と判定
    するよう処理することを、 特徴とするプログラム解析装置。
  6. 【請求項6】 請求項1ないし5記載のプログラム解析
    装置において、 定義型名一覧表に型名を登録する型定義処理部(14)を備
    え、 かつ、DD検出処理部(10)は、定義型名一覧表に登録さ
    れる型名については識別子と扱わない構成を採るととも
    に、更に、Cソースプログラム部分の{ }外におい
    て、「typedef 」の出現を検出する構成を採って、 上記DD検出処理部(10)が「typedef 」の出現を検出す
    るときには、そのCソースプログラム部分を宣言と判定
    するとともに、上記型定義処理部(14)の起動を指示し、
    この指示を受けて、上記型定義処理部(14)は、該「type
    def 」の後に続く識別子を型名として定義型名一覧表に
    登録するよう処理することを、 特徴とするプログラム解析装置。
  7. 【請求項7】 請求項5記載のプログラム解析装置にお
    いて、 「( )」と、「{ }」と、「〔 〕」と、「 ”
    ”」と、「 ’ ’」とを対称記号とすることを、 特徴とするプログラム解析装置。
  8. 【請求項8】 請求項7記載のプログラム解析装置にお
    いて、 「\’」に含まれる「 ’」と、「\”」に含まれる
    「 ”」とについては対称記号の対象として扱わないこ
    とを、 特徴とするプログラム解析装置。
  9. 【請求項9】 請求項6記載のプログラム解析装置にお
    いて、 DD検出処理部(10)は、Cソースプログラム中の英字か
    下線で始まり、英数字か下線が続く文字範囲を名前とし
    て検出し、該名前のうち、C言語の予約語でなく、かつ
    定義型名一覧表に登録されていない名前を識別子と扱う
    ことを、 特徴とするプログラム解析装置。
JP4275614A 1992-10-14 1992-10-14 プログラム解析装置 Withdrawn JPH06124211A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP4275614A JPH06124211A (ja) 1992-10-14 1992-10-14 プログラム解析装置
US08/739,215 US5649201A (en) 1992-10-14 1996-10-29 Program analyzer to specify a start position of a function in a source program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP4275614A JPH06124211A (ja) 1992-10-14 1992-10-14 プログラム解析装置

Publications (1)

Publication Number Publication Date
JPH06124211A true JPH06124211A (ja) 1994-05-06

Family

ID=17557910

Family Applications (1)

Application Number Title Priority Date Filing Date
JP4275614A Withdrawn JPH06124211A (ja) 1992-10-14 1992-10-14 プログラム解析装置

Country Status (2)

Country Link
US (1) US5649201A (ja)
JP (1) JPH06124211A (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2254494A1 (en) * 1998-11-19 2000-05-19 Netron Inc. Method of identifying recurring code constructs
US20020144246A1 (en) * 2001-03-29 2002-10-03 Ibm Corporation Method and apparatus for lexical analysis
US7246267B2 (en) * 2001-10-01 2007-07-17 Tektronix, Inc. Logic analyzer having a disassembler employing symbol table information for identifying op-codes
US9696973B1 (en) * 2016-02-24 2017-07-04 Semmle Limited Compilation cache with imports scanner

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4667290A (en) * 1984-09-10 1987-05-19 501 Philon, Inc. Compilers using a universal intermediate language
US5361351A (en) * 1990-09-21 1994-11-01 Hewlett-Packard Company System and method for supporting run-time data type identification of objects within a computer program
US5293629A (en) * 1990-11-30 1994-03-08 Abraxas Software, Inc. Method of analyzing computer source code
JP3062266B2 (ja) * 1991-03-20 2000-07-10 富士通株式会社 支援装置
US5317509A (en) * 1992-01-21 1994-05-31 Hewlett-Packard Company Regular expression factoring for scanning multibyte character sets with a single byte automata machine

Also Published As

Publication number Publication date
US5649201A (en) 1997-07-15

Similar Documents

Publication Publication Date Title
US5890103A (en) Method and apparatus for improved tokenization of natural language text
US4860203A (en) Apparatus and method for extracting documentation text from a source code program
US7779049B1 (en) Source level optimization of regular expressions
CN113987405A (zh) 一种基于ast的数学表达式计算算法
EA037156B1 (ru) Способ поиска в тексте совпадений с шаблонами
JPH06124211A (ja) プログラム解析装置
US20220004708A1 (en) Methods and apparatus to improve disambiguation and interpretation in automated text analysis using structured language space and transducers applied on automatons
KR20080045545A (ko) 조건부 영역을 전처리하는 방법
JPH0619962A (ja) テキスト分割装置
JPH05189242A (ja) パーサ自動生成方法
KR20010057781A (ko) 다중어 형태소 분석장치 및 그 방법
JP2001067356A (ja) 語彙獲得方法、語彙獲得装置及び語彙獲得プログラムを記録したコンピュータ読み取り可能な記憶媒体
Clarke et al. Error handling in a parallel LR substring parser
JPS6368972A (ja) 未登録語処理方式
JP2580336B2 (ja) 言語処理系における名前の属性検査処理方式
Capon et al. Syntax analysis
CN114443685A (zh) 一种sql注入检测方法及装置
JPH0827797B2 (ja) 構文解析装置
Dempsey et al. A regular expression pattern matching processor for APL
WO1997007452A1 (en) Programmable compiler
Sestoft et al. From Concrete Syntax to Abstract Syntax
JPH05143351A (ja) 原始プログラム比較方式
Kanakaraddi et al. NATURAL LANGUAGE PARSING USING FUZZY CANONICAL LR (1) PARSER
JPH04237365A (ja) テキスト処理装置における差分検出方式および自動編集方式
JPH04313123A (ja) 構文規則処理方法

Legal Events

Date Code Title Description
A300 Application deemed to be withdrawn because no request for examination was validly filed

Free format text: JAPANESE INTERMEDIATE CODE: A300

Effective date: 20000104