字句解析プログラムの設計と字句解析プログラムの設計と実装を実装

字句解析プログラムの設計と実装

字句解析プログラム(字句 アナライザ)要件:

- 文字で構成されるソースプログラムからの流れは左から右へスキャン

- (言葉の語彙的意味を識別する語彙素

- 戻り単語レコード(単語クラス、単語そのもの)

- フィルタースペース

- コメントをスキップ

- 字句エラーが見つかりました

 

プログラムの構造:

入力:文字ストリーム(入力どのような方法、どのようなデータ構造で格納されています)

治療:

- トラバース(何トラバーサル)

- 字句のルール

出力:ワードストリーム(どのような出力形式)

- タプル

 

Wordのクラス:

1.識別子(10)

符号なし2(11)

3.ワード(単語1ヤード)のままにします

4.オペレータ(単語1ヤード)

5.区切り文字(ワード1ヤード)

Wordのシンボル

種はコーディングしません

Wordのシンボル

種はコーディングしません

ベギン

1

17

もし

2

:=

18

それから

3

<

20

同時に

4

<=

21

行う

5

<>

22

終わり

6

>

23

L(リットル| D)*

10

> =

24

DD *

11

=

25

+

13

;

26

-

14

27

*

15

28

/

16

0

コード:

する#include <stdio.hに>
する#include <STDLIB.H>
の#include <string.hの>
の#define SIZE 100
INT P = 0、SYN、N-、I、グローバル変数であり、他の記録タイプの// SYNコード
チャーPROG [SIZE]、CH、トークン[8];
定義@キー; CHAR *キーワード[6] = { "開始"、 "次に"、 "IF"、 "一方"、 "行う"、 "終了"} ワードアレイ
ボイドscaner(); //配列の数が移動さPROGトークン配列が比較されるが、コードの他の種類の更新
メイン()
{
P = 0;
のprintf(「『#』末端で(ソース文字列を入力してください) :\ N- ");
実行
{
CH = GETCHAR();
PROG [P ++] = CH;
}一方(CH = '#'); //エントリキーボード入力文字列配列PROG!
P = 0;
DO
{
Scaner ();
スイッチ(SYN)
{
ケース-1:のprintf( "N- \字句解析エラー"); BREAK;
デフォルト:のprintf(「<%D、%S> \ n」、)、トークンシン;破ります;
}
}一方(SYN = 0]) ; // 入力#番号、SYNコードの他の種類は、0、サイクルの終わりで
のprintf( "N- \字句解析成功");
GETCHAR();
}
ボイドScaner()
{
ための(N-0 =であり; n <8であり; n ++) // トークン配列を初期化
{[N-】トークン= '\ 0';}
N- = 0;
CH = PROG [P ++];
一方、(CH == '')
{CH = PROG [P ++] ;}
((CH> = '' && CH <= 'Z')||(CH> = '' && CH <= 'Z'))//入力キーかどうかを決定した場合
、{
{行う
- ++トークン[Nを] = CH;
CH = PROG [P ++];
}ながら((CH> = '' && CH <= 'Z')||(CH> = '' && CH <= 'Z')||(CH> = '0' && CH <=));」9'
SYN = 10;
(N = 0; N- <6; N - ++)//コントラスト6つのキーワード
{
IF(のstrcmp(トークン、キーワード[N-])== 0)
SYN = N + 1;
}
P--;
}
そうIF(CH> = '0' && CH <=」9' )//入力が整数定数であるか否かを判定する
{
P-- ;

{
[N ++] = PROGトークン[P ++]。
CH = PROG [P]。
}一方、(CH> = '0' && CH <= '9')。
SYN = 11。
返します。
}

{
スイッチ(CH)
{
ケース'+':SYN = 13;破る; [0] CH =をトークン。
ケース' - ':SYN = 14; [0] = CHトークン;破ります;
場合'*':SYN = 15; [0] = CHトークン;破ります;
ケース'/':SYN = 16; [0] = CHトークン;破ります;
ケース':':SYN = 17; [0] = CHトークン。
CH = PROG [P ++]。
IF(CH == '='){[1] CH =をトークン、SYN ++;}
そうP--。
ブレーク;
ケース'<':SYN = 20; [0] = CHトークン。
CH = PROG [P ++]。
IF(CH == '>'){トークン[1] = CH; SYN ++;}
そうでない場合(CH == '='){トークン[1] = CH; SYN = SYN + 2。
} 他P--。
ブレーク;
ケースは、 '>':SYN = 23である; [0] = CHトークン
CH PROG = [P ++];
IF(CHを== '='){[1]トークン= CH; SYN ++;}
そうP--;
BREAK。
ケース'=':SYN = 25; [0] = CHトークン; BREAK;
場合を';':SYN = 26であり、トークン[0] = CH; BREAK;
ケース'(':SYN = 27;トークン[0] = CH; BREAK;
ケース')':SYN = 28;トークン[0] = CH; BREAK;
ケース'#':SYN = 0;トークン[0] = CH; BREAK;
デフォルト:のprintf(「字句解析エラー、してください!チェックかどうかを入力無効な文字\ N- "); SYN = -1; BREAK;
}
}
}

業績

 

 

 

字句解析プログラム(字句 アナライザ)要件:

- 文字で構成されるソースプログラムからの流れは左から右へスキャン

- (言葉の語彙的意味を識別する語彙素

- 戻り単語レコード(単語クラス、単語そのもの)

- フィルタースペース

- コメントをスキップ

- 字句エラーが見つかりました

 

プログラムの構造:

入力:文字ストリーム(入力どのような方法、どのようなデータ構造で格納されています)

治療:

- トラバース(何トラバーサル)

- 字句のルール

出力:ワードストリーム(どのような出力形式)

- タプル

 

Wordのクラス:

1.識別子(10)

符号なし2(11)

3.ワード(単語1ヤード)のままにします

4.オペレータ(単語1ヤード)

5.区切り文字(ワード1ヤード)

Wordのシンボル

種はコーディングしません

Wordのシンボル

種はコーディングしません

ベギン

1

17

もし

2

:=

18

それから

3

<

20

同時に

4

<=

21

行う

5

<>

22

終わり

6

>

23

L(リットル| D)*

10

> =

24

DD *

11

=

25

+

13

;

26

-

14

27

*

15

28

/

16

0

コード:

する#include <stdio.hに>
する#include <STDLIB.H>
の#include <string.hの>
の#define SIZE 100
INT P = 0、SYN、N-、I、グローバル変数であり、他の記録タイプの// SYNコード
チャーPROG [SIZE]、CH、トークン[8];
定義@キー; CHAR *キーワード[6] = { "開始"、 "次に"、 "IF"、 "一方"、 "行う"、 "終了"} ワードアレイ
ボイドscaner(); //配列の数が移動さPROGトークン配列が比較されるが、コードの他の種類の更新
メイン()
{
P = 0;
のprintf(「『#』末端で(ソース文字列を入力してください) :\ N- ");
実行
{
CH = GETCHAR();
PROG [P ++] = CH;
}一方(CH = '#'); //エントリキーボード入力文字列配列PROG!
P = 0;
DO
{
Scaner ();
スイッチ(SYN)
{
ケース-1:のprintf( "N- \字句解析エラー"); BREAK;
デフォルト:のprintf(「<%D、%S> \ n」、)、トークンシン;破ります;
}
}一方(SYN = 0]) ; // 入力#番号、SYNコードの他の種類は、0、サイクルの終わりで
のprintf( "N- \字句解析成功");
GETCHAR();
}
ボイドScaner()
{
ための(N-0 =であり; n <8であり; n ++) // トークン配列を初期化
{[N-】トークン= '\ 0';}
N- = 0;
CH = PROG [P ++];
一方、(CH == '')
{CH = PROG [P ++] ;}
((CH> = '' && CH <= 'Z')||(CH> = '' && CH <= 'Z'))//入力キーかどうかを決定した場合
、{
{行う
- ++トークン[Nを] = CH;
CH = PROG [P ++];
}ながら((CH> = '' && CH <= 'Z')||(CH> = '' && CH <= 'Z')||(CH> = '0' && CH <=));」9'
SYN = 10;
(N = 0; N- <6; N - ++)//コントラスト6つのキーワード
{
IF(のstrcmp(トークン、キーワード[N-])== 0)
SYN = N + 1;
}
P--;
}
そうIF(CH> = '0' && CH <=」9' )//入力が整数定数であるか否かを判定する
{
P-- ;

{
[N ++] = PROGトークン[P ++]。
CH = PROG [P]。
}一方、(CH> = '0' && CH <= '9')。
SYN = 11。
返します。
}

{
スイッチ(CH)
{
ケース'+':SYN = 13;破る; [0] CH =をトークン。
ケース' - ':SYN = 14; [0] = CHトークン;破ります;
場合'*':SYN = 15; [0] = CHトークン;破ります;
ケース'/':SYN = 16; [0] = CHトークン;破ります;
ケース':':SYN = 17; [0] = CHトークン。
CH = PROG [P ++]。
IF(CH == '='){[1] CH =をトークン、SYN ++;}
そうP--。
ブレーク;
ケース'<':SYN = 20; [0] = CHトークン。
CH = PROG [P ++]。
IF(CH == '>'){トークン[1] = CH; SYN ++;}
そうでない場合(CH == '='){トークン[1] = CH; SYN = SYN + 2。
} 他P--。
ブレーク;
ケースは、 '>':SYN = 23である; [0] = CHトークン
CH PROG = [P ++];
IF(CHを== '='){[1]トークン= CH; SYN ++;}
そうP--;
BREAK。
ケース'=':SYN = 25; [0] = CHトークン; BREAK;
場合を';':SYN = 26であり、トークン[0] = CH; BREAK;
ケース'(':SYN = 27;トークン[0] = CH; BREAK;
ケース')':SYN = 28;トークン[0] = CH; BREAK;
ケース'#':SYN = 0;トークン[0] = CH; BREAK;
デフォルト:のprintf(「字句解析エラー、してください!チェックかどうかを入力無効な文字\ N- "); SYN = -1; BREAK;
}
}
}

業績

 

 

 

おすすめ

転載: www.cnblogs.com/lwwwjl123/p/11653589.html