• 検索結果がありません。

ARITHMETIC  RETURN

ドキュメント内 Sapidによるソフトウェア解析技法 (ページ 47-53)

c a s e  EXPR̲SORT̲FUNCCALL: 

tum"  FUNCCALL " ; b r e a k ;  

回 目

E X P R ̲ S O R T ̲ I N I T U S T :

tum"I N I T I A U Z E  " ; b

刊誌;

回 目

EXPR̲RETURN:

r

e t u r n"  RETURN " ; b r e a k ;   d e f a u l

t: 

r e t u r n  "OTHER E X P R E S S I O N " ;  

関数 ge

tE

xpressionSort 一 式 の 種 類 を 求 め る 73400754

ー(吋)

734 ∞ 355 r e t u m i  + 

734 ∞ 3913 i = O  

734 ∞ 4214 k <  100 

734 ∞ 4515

I<

=10 

734005216 k=add

(i++

k )   7340055 1 8  j =  1  734 ∞ 58 1 8  j

=10

734 ∞ 6018 j + +  

734 ∞ 64 1 9  d e c ( &

i) 

734 ∞ 6922 p r i n t f ( " i = % d  k=%d¥n

i k )

734 ∞ 7124 r e t u m  0 

2 . 2  

オブジェクト

expression

の構文解析

ARITHMETIC  RETURN  ARITHMETIC  ARITHMETIC  ARITHMETIC  ARITHMETIC  ARITHMETIC  ARITHMETIC  ARITHMETIC  FUNCCALL  FUNCCALL  RETURN 

C 言 語 を は じ め と す る 手 続 き 型 言 語 で は 、 変 数 に 対 し て 値 と 記 憶 領 域 が 割 り 当 て ら れ る 。 変 数 が 代 入 式 の 左 辺 に 現 れ る 場 合 は 変 数 の 記 憶 領 域 を 指 し 、 右 辺 に 現 れ る 場 合 は 変 数 の 値 を 指 す 。 そ れ ぞ れ 左 辺 値 (EXPR̲L̲VALUE)

, 

右 辺 値 (EXPR̲R̲ VALUE) と呼ぶ。 c 言 語 で は a++ の よ う に 値 と 記 憶 領 域 を 同 時 に 参 照 す る 式 も 存 在 し 、 こ れ を 左 右 辺 値(EXPR̲LR̲ VALUE) と呼ぶ。

EXPR L VALUE  左辺値 EXPR R VALUE  右辺値

EXPR PL V  ALUE  ポインタ付き左辺値 EXPR PR V  ALUE  ポインタ付き右辺値 EXPR P REF 

アドレス参照

EXPR LR VALUE  左辺値かつ右辺値 EXPR PLR VALUE  ポインタ付き左右辺値

l e x p r e s s i o n

の属性

l r t y p e

のマクロ定義]

42  Sapidによるソフトウェア解析技法

*stmtは 基 本 文 を 表 すexpression

6.

式 の 構 造

基本文である

e x p r e s s i o n

オブジェクト (図

6

) を 対 象 と し て 構 文 を 解 析 す る 。

e x p r

s i o n (

式)が

i d e n t i f i e r

と関連

i d e n t ̲ r e f

を 持 つ 場 合 は 変 数 の み の 式 と な り 、

c o n s t a n t

と関連

c o n s t ̲ r e f

を持っときは定 数 の み の 式 と な る 。 下 位 に 式 を 持 つ 場 合 は、関連

expr̲op

を用いて演算子の存在 を調べ、再帰的に下位の式を構文解析す る。

サ ン プ ル プ ロ グ ラ ム

3‑2

ー オ ブ ジ ェ ク ト

e x p r e s s i o n

の 構 文 解 析

#函己亘面三証函瓦五〉

#include <Sapid/Sapid.h> 

void  olll!nModel(SpdDBld);  S

P 4

0tjI(! getpressionlnfo(SpdObjld); SpdObjld geUdenUnfo(SpdObjld)); 

cn8r 

geCOperator̲Info(SpdObjld);/ / 2章3.4参 照 Tt main(mtc,伽f岬[])

SDBld dbld;  S凶ObjldArray expr̲array;  SpdObjld  exprid; iot   i; dbld = s凶OpenSDBO;

openModel(dbld); 

expr̲array = spdGetObjldArray("expression", NULL, NULL); 

for (i = 0; i expr̲array.size; i++) {  expr̲id=expr̲3rray.id[i]; 

/ / stateme町叩nBtと な るexprslo町叩nオプジエクトを選び情報を出力 E

臨s凶 白 仏 叫R

d 嗣 l 旧 O 壇 橋 ; 恋 一 4

凶司'但

U

r r r

ピ 巾 .

s制凶

h ω E 慌 毘 坑 刈 ( 叩 削

;g朕酬edtE炉岱凶ionI曲{加回Pr一̲̲iidd);}  sodFreeObiIdArraYI eXDr  aπav): 

tum

( E X I T ̲ s u e e

ilS

s :

工 一

関数

g e t E x p r e s s i o n l n f o

式の情報を求める

刊,idgetExpressionlnfo(SpdOIdeUd){

SpdObjld  idenUd, cons.̲idexpr l̲id, op̲id;  SpdCursorexpr由民・op田 町

/ / ↓ 融 行 の み の 式 の 場 合

if((idenUd= spdGetARelO均(expr)~九dent refγany"))!=SAPID̲NON̲ID)  {geUdentJnfo{idenUd); retum;} 

/ ↓ 定 数 の み の 式 の 場 合

else if((consUd = spdGetAReIObj(expr̲id"∞nsCref'"any"))!=SAPID̲NON̲ID) 

3

プ ロ グ ラ ム の 構 造 を 解 析 す る 43  面 而 成 可 函t

克 己

sGetAttrValString(∞nsCid."value"));return;} 

1 1

↓式の持つ演算子を!帳番に出力

op~白r=spdGetReIObjlnit(expr̲id. "expr̲opぺ"any"); wbile ((op~Jd = spdGetRelObj{opr))!=SAPID̲NON̲ID) 

printf(" up ¥"%s¥" ".geCOperator̲info(op̲id)); 

1 1

↓下位式を求める

expr即 =spdGetRelObjlnit(expr̲id. "expr̲expr". "p‑id"); while ((expr l̲id = spdltRelO(expr一四))!= SAPID̲NON̲ID) { 

printf(n¥t¥tSub‑expo(96d:%s ".expr̲id. spd

G e

tObjTexi(expr Ud)); 

getExpressionlnfo(expr l̲id);} 

関数 g e t ̲ i d e n t ̲ i n f o ‑ i d e n t i f i e r の情報を出力

void geUdenUnfo(SpdObjld idenUd) 

if(spdGetAttrValInt(idencid. "so目")== ID3ARlABLE)  prinぜ''Var:%s". spdGetName(idenCid)); 

else if(spdGetAttrValInt(idenCid. "sort") == ID̲FUNCTION)  pnn'C'Func:%s".  spdGetName(idenCid)); 

関数 g e t ̲ O p e r a t o r  ̲ i n f o   ‑i d e n t i f i e r の情報を出力

char

geCOperator̲info(SpdO切Idoperator̲id){ 

switch(spdGetAttrValInt(operator̲id. "sort")){ 

曲 目OP INC: 

return "++";bak;

回 目OPDEC:

return ")";bak; 途 中 省 略 case τYFE DOTS: 

return ".";break;  default: 

return "OTHEROPERATOR"; 

実行結果(一部)

4:ー(吋)(7340075) OP:"‑‑" 

Sub‑exp of 7340075:()(7340074)OP:")" OP:"(" 

Sub‑exp of 7340074;(7340073)OP・町"

Sub‑expof 7340073:i (7340072)Var:i  11 :i=O (7340039) OP:"=" 

Sub‑exp of 7340030(7340038)Const:O  Sub‑exp of 734003i(7340037) Var:i  14 :k< 100 (7340042) OP阿<"

Sub‑exp of 734004ZJOO (7340041) Const: 100  Sub‑exp of 7340042:k (7340040) Var:k  17 :i<= 1 0 (7340045) OP:"<=" 

Sub‑expof 7340045:10(7340044) Const: 10  Sub‑exp of 734004Si (7340043) Var:i  24 :k=add(i++.k) (7340052) OP:"=" 

Sub‑exp of 734005zadd(+.k)(734005))  Sub‑exi> of 7340051:add (7340047) Func:add  Sub‑exp of 7.340051:k (7340050) Var:k  Sub‑exi> of 7340051:i++ (7340049) OP:"++ 

Sub‑exp of 7 34004g:i (7340048) Var:i  Sub‑exp of 7340052:k (7340046) Var:k 

4 4   S a p i d

によるソフトウエア解析技法

ident4VAR) 

/  k  / 

7340052 

73400497340050 

5 日 「 τ 寸

i d e n t ( V

‑AliL一 /  k 

7 . k

add(

i++

k J

の構文解析

E  クラス blαk

クラス

block

は、変数を宣言する宣言部と手続きを記述する実行部から構成 される。宣言部を持つブロックは、関数宣言の本体や、ブロック内でのみ有効 な局所変数を宣言するブロックなどである。ブロックは内部にサブ(下位)ブ ロックを持つ。最底辺の

block

オブジエクトはクラス

expression

オブジエクト と関連

blk̲expr

を持つ。このような

block

オブジェクトを

basicblock

と呼ぶ。

i n t  k= O ;  

宣 言 部 実行部(サブブロック)

f o r ( j = 1 ; j < 4 ; j + +  ) {   i n c ( k ) ;  

p r i n t f ( i=%dj=%dk=%d¥n"  , i j , , k ) ;  

8 .

ブロックの構造

b a s i c  block 

1・・・式n

サブブロック

9.

3

プログラムの構造を解析する

45  block

を、中括弧 " { t ' と γ' で囲まれたブロック、制御構造による分岐ブロック、

分 岐 の な い 連 続 す る 文 の 列 の 3 種類に分ける。"{"と"}"で固まれた部分を

compound block

と呼ぶ。

if

for

while

と い っ た の 制 御 文 の 「 長 さ 」 は 、 キ ー ワ ー ド の 先 頭 か ら 分 岐 の 終 点 ま で で あ る 。 文 の 最 大 の 列 を

basicblock

と呼 ぶ 。

basicblock

の 前 後 に は 別 の

basicblock

は 現 わ れ な い 。 分 岐 の 終 点 は 、 合 流 す る 次 の 文 の 直 前 で あ る 。 空 白 や 改 行 、 セ ミ コ ロ ン は 無 視 す る 。 分 岐 先 の 手 続き部もサブブロックである。

↓IF

ブロック

if(i(=10) 

←分岐先のサブブロック

k=add(i++.k); 

↑分岐の終点

10.

BLOCK BASIC  Ba8ic block  BLOCK COMP  Compound block  BLOCK IF  IF

文の

block BLOCK SWITCH  SWITCH

文の

block BLOCK FOR  FOR

文の

block BLOCK WHILE  WHILE

文の

block BLOCK DO  DO

文の

block BLOCK BRANCH 

分岐

block

BLOCK HIERACHICAL 

他の

block

を含む

block [block

の属性

80rt

のマクロ定義]

ifblock

始まり

14  if(i< = 10)

basic block

始まり

15  k=add(i++,k);

basic block

終わり

16  else ↓forblock

始まり

↓compound block

始まり

17  for

( j =  

1; j<= 1j++){

basicblock

始まり

18  dec(&i);

basic block

終わり

19  } ←

compound block

終わり

forblock

終わり

&ifblock

終わり

[サンプルプログラム

1

のブロック構造(部分 ) J

46 

S a p i d

によるソフトウェア解析技法

3 . 1  

クラス

block

の情報の取得

program  name :maln 

file  ded  declaration  sort:DECL FUNCDEF 

ded decl  プロック

blk  blk  declarator 

sort:DECL FUNCDEF 

decl  oot  optional̲decl  sort:OPY FUNCDEF 

func̲body  block 

sort:BLOCK COMP 

1 1 .

b l o c k

オブジェクトの基本情報を取得す るプログラムを作成する。最上位のブロ ッ ク は 、 関 数 宣 言 の オ プ シ ョ ナ ル 部 分 (クラス

o p t i o n a l d e c l

)と関連

func̲body

を 持 つ 。 最 底 辺 の ブ ロ ッ ク は ク ラ ス

白 戸 田

s i o n

のオブジェクトと関連

blk3xpr

を持つ。関数の中で出現するブロック情 報を求める。

#include <stdio.h> 

#include <SapidfSapid.h> 

サンプルプログラム

3‑3

ブロック情報を求める

void  openModel(SpdDBld); 

SpdObjI(J getBlocklnfo(SpdOdld); int main(int argc, charargv[]){

SpdObjldArray blk̲a'ay; iot  1; 

SpdDBld  dbld;  dbld sOpenSDBO;

openMo(Jel(dbld); 

' A U  

B I

a L U J

L a  

U

N a

L i K  

1 D b  

J

2 P 1

N M W  

J

H a一

m

r r H K K  

OLM

︑ 削 M M F J m ' bi

一 日H

の此到M E

開 制

V .

S01CTι 

=

= I I  

w n

a ‑ h

r

R u e o n

void get

I l

locl厄iif玩可証oo}ia‑WocUd){

関数

g e t B l o c k I n f o

オブジエクト

b l o c k

の基本情報を求める

int  attr̲ val; 

attr  val 

s凶GetA伽'ValInt(blk̲id"sort"); 

switch(attr̲ val){ 

回 目BLOCK BASIC: 

{printf("BASIC Block")eak;}

曲 目B1ρCK IF: 

{printf("IF Block");break;} 

田 町B1βCK FOR: 

{printf("FOR Block");break;} 

団 関BLOCKWHlLE: 

{printf("WHILE Block");break;} 

曲 目BLOCK COMP: 

{printf("{} Block");brk;}

seBLOCK BRANCH: 

{printf("BRANCH Block");bak;} defauIt: 

printf("OhrBlock");  } 

実行給果(部分)

{} Blockー>BlocklD 6291457  BASICBlock‑> BlocklD 6291458  BASICBlock‑> BlocklD 6291459

ベ D

BASIC Block‑> BlocklD 6291460

ベ 9

{} Block司>BI:klD 6291461  ‑‑(4)  FORBlock‑> BlocklD 6291462 ‑(3)  IFBloc主ー>Block lD 6291463  {j)  BASICBlock‑> BlocklD 6291464  {} Block ‑> Block lD 6291465 

ifblock 6291463 (l)  if(i<=10) 

k=add(i++k);basic block 6291459 (2)  else for b10ck 6291462 (3) 

3 プログラムの構造を解析する 47 

forU= 1; j<= 10; j++){compound block 6291461 (4) 

basic block 6291460 (5)  dec(&i); 

3 . 2   ブロック構造の解析

ドキュメント内 Sapidによるソフトウェア解析技法 (ページ 47-53)