十二の仕事:実験2つの再帰下降構文解析

まず、実験の目的:

C言語の使用は、手順を解析する再帰下降、および簡単な言語の構文解析をコンパイル。

再帰下降構文解析、構文チェックの準備とは配列分析により設けられたワード字句解析プログラムの構造を実現します。

 

第二に、実験的な原則

各非終端記号は、サブルーチンに対応しています。

このサブルーチンは、製造中に処理される次の入力シンボル(セットを選択)に記載の製造次に右端に応じて決定されます。

  • 各出会いターミネーターは、一致した場合、現在の読み出しワードは、ターミネーターと一致するかどうかを判断し、次いで、次のワードは、分析を継続するために読み取られ、一致しない場合、エラー処理が行われます
  • それぞれの出会い非終端、適切なサブルーチンが呼び出されます

 

第三に、実験は明確化を求めました

文法が正しい文章であれば、「#」最後に単語列を入力し、出力成功情報、「成功」を印刷し、それ以外の場合は出力「エラー」、およびタイプと場所の文法の誤りを指摘しました。

例えば:

入力が開始:= 9; X = 2 * 3; B:= + X端#

出力成功

入力のx:= A + B * Cエンド#

出力「終了」のエラー

 

第四に、実験手順

1。解析対象とする言語の文法(P90参照)

2。文法少なくとも含んでなる、発現されます

- ステートメント

- 条件

- 式

左再帰を排除3.

4.左の共通因子を抽出

5. SELECTセットコンピューティング

6. LL(1)文法が決定されます

7.再帰下降パーサ

 

コードは以下の通りであります:

書式#include <stdio.hに>
する#include <string.hの>
する#include <stdlib.h>に含ま

チャーPROG [80] = "開始:= 9; X * 3 = 2; B:= + X端#"、トークン[50]。
CHAR CH;
INT行、SYN、P、M、I、合計。
CHAR * rwtab [6] = { "しばらく"、 "行う"、 "終了"、 "次に、" "IF"、 "開始"}。
INTフラグ= 0。
無効E();
無効T();
空E1();
空隙T1();
空F();

} } }そうであれば(CH> = '0' && CH <= '9'){ 和= 0。一方、(CH> = '0' && CH <= '9'){ 合計=合計* 10 +(CH-'0' )。






























CH = PROG [P ++]。
}
P--。
SYN = 11。
}他のスイッチ(CH){
ケース'+':
トークン[0] = CH; SYN = 13。
ブレーク;
ケース' - ':
トークン[0] = CH; SYN = 14。
ブレーク;
場合'*':
トークン[0] = CH; SYN = 15。
ブレーク;
ケース'/':
トークン[0] = CH; SYN = 16。
ブレーク;
ケース':':
私は= 0;
トークン[I ++] = CH;
CH = PROG [P ++]。
(CH == '='){もし
トークン[I ++] = CH。
SYN = 18。
{}他
のSYN = 17。
P--;
}
ブレーク;
ケース'<':
私は= 0;
トークン[I ++] = CH;
CH = PROG [P ++]。
(CH == '='){もし
トークン[I ++] = CH。
SYN = 21。

トークン[I ++] = CH;
SYN = 22。
{}他
のSYN = 20。
P--;
}
ブレーク;
ケース'>':
私は= 0;
トークン[I ++] = CH;
CH = PROG [P ++]。
(CH == '='){もし
トークン[I ++] = CH。
SYN = 24。
{}他
のSYN = 23。
P--;
}
ブレーク;
ケース'=':
トークン[0] = CH; SYN = 25。
ブレーク;
ケース';':
トークン[0] = CH; SYN = 26。
ブレーク;
ケース'(':
トークン[0] = CH; SYN = 27;
ブレーク;
ケース''):
トークン[0] = CH; SYN = 28。
ブレーク;
ケース'#':
トークン[0] = CH; SYN = 0。
ブレーク;
ケース'\ n'は:
SYN = 100;
ブレーク;
デフォルト:

ブレーク;
}
}

ボイドE(){
IF(SYN == 1){
scaner()。
T();
(SYN == 26){一方
scaner()。
T();
}
IF(SYN == 6){
scaner()。
もし(シン== 0 &&フラグ== 0){
のprintf( "成功\ n個!");
}
}
他{
のprintf( "エラー、缺少端\ N!")。
}
}他{
のprintf( "エラー、缺少開始\ nは!");
フラグ= 1。
}
を返します。
}

ボイドE1(){
T1()。
一方、(SYN == 13 || SYN == 14){
scaner()。
T1()。
}
を返します。
}

Tボイドは(){
IF(SYN == 10){
Scaner();
IF(SYN 18である==){
Scaner();
E1は();
} {他
のprintfは(「構文エラーがエラーである:%S \ N! ")、トークン;
。、フラグ= 1;
}
}他{
!IF(のフラグ= 1){
のprintf("構文エラーは、エラーがある:%S \ N-」)トークン、
のフラグ= 1;
}
}
}

空隙T1(){
F()。
一方、(SYN == 15 || SYN == 16){
scaner()。
F()。
}
を返します。
}

F.ボイド(){
IF(SYN SYN || == == 10 11){
Scaner();
}そうIF(SYN == 27){
Scaner();
E1();
IF(SYN == 28)
Scaner( );
他{
のprintf( "!NO '')、構文エラー\ N-");
。、フラグ= 1;
}
}
他{
のprintf( "構文エラーエラーはありません:%S \ N-!"、トークン)
のフラグ= 。1;
}
リターン;
}

int型のmain(){
P = 0;
のprintf( "入力してください構文声明:");
{行う
CH = getchar関数();
PROG [P ++] = CH;
}ながら、(CH = '#'!);
P = 0;
scaner();
E();
のprintf( "最後の分析!");
getchar関数();
}

 

おすすめ

転載: www.cnblogs.com/keshangming/p/11940855.html