字句解析プログラム(字句 アナライザ)要件:
- 文字で構成されるソースプログラムからの流れは左から右へスキャン
- (言葉の語彙的意味を識別する語彙素)
- 戻り単語レコード(単語クラス、単語そのもの)
- フィルタースペース
- コメントをスキップ
- 字句エラーが見つかりました
プログラムの構造:
入力:文字ストリーム(入力どのような方法、どのようなデータ構造で格納されています)
治療:
- トラバース(何トラバーサル)
- 字句のルール
出力:ワードストリーム(どのような出力形式)
- タプル
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;
}
}
}
業績