字句解析プログラム(字句 アナライザ)要件:
- 文字で構成されるソースプログラムからの流れは左から右へスキャン
- (言葉の語彙的意味を識別する語彙素)
- 戻り単語レコード(単語クラス、単語そのもの)
- フィルタースペース
- コメントをスキップ
- 字句エラーが見つかりました
プログラムの構造:
入力:文字ストリーム(入力どのような方法、どのようなデータ構造で格納されています)
治療:
- トラバース(何トラバーサル)
- 字句のルール
出力:ワードストリーム(どのような出力形式)
- タプル
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 |
彼女はJavaで書かれたJavaプログラミング言語の使用に慣れていたのでこれは字句解析手法です。デジタルセパレータを区別するために、それぞれ、それらに対応する文字コードの他の種類の。
プログラムコード:
輸入java.io.BufferedReader; インポートにjava.io.IOException; 輸入java.io.InputStreamReader。 インポートjava.util.Scanner; パブリッククラスLexicalAnalyzer { 静的文字列[]キーワード=新しいString [] { "メイン"、 "IF"、 "次に"、 "一方"、 "行う"、 "静的"、 "INT"、 "ダブル"、 "構造体"、 "休憩"、 "他"、 "長い"、 "スイッチ"、 "ケース"、 "typedefの"、 "文字"、 "戻る"、 "CONST"、 "フロート"、 "短い"、 "継続します"、 、「無効」「の」、「はsizeof」}; //シードキーワードが最初からコードしません 静的char型CH; 静的なint型のインデックス。 静的int型のSYN、和= 0、行。 静的な文字列str = ""; 静的StringBuilderのワード=新しいStringBuilderの(「」); //が追加したテキストメッセージを読みやすいのStringBuilderを構築 パブリック静的無効メイン(文字列[] args){ インデックス= 0; 行= 1; //は、第1の走査線から始まります System.out.println(「#記号で終わる(C言語のソースコードの文字列を入力してください):」); BufferedReaderのはBF =新しいをBufferedReader(新しいInputStreamReaderの(System.in)); {試します 行う{ 文字列testStr; testStr = bf.readLine()。 サイズ+ = testStr。 CH = testStr.charAt(testStr.length() - 1); //は、最後の単語の文字を読んで }しばらく(CH = '#'!)。 }キャッチ(IOExceptionを電子){ e.printStackTrace(); } インデックス= 0; //は、見出し語文字をリセット 行う{ アナライザ(); //出力デジタル・コードおよび他の種 IF(シン== 26){ System.out.println( "(" + SYN + " "+和+")")。 } 他の場合(シン== - 1){ System.out.println(「コードシンボルがない他の種!」); } 他の場合(シン== - 2){ } 他の{ System.out.println( "(" + SYN + " "+単語+")")。 } }一方(SYN = 0!)。 } 静的ボイドアナライザー(){ //単語空の容器 word.delete(0、word.length())。 CH = str.charAt(インデックス++); //各単語を取得する文字 //スキップスペース (CH ==」「){一方 CH = str.charAt(インデックス++)。 } ((CH> = '' && CH <= 'Z')||(CH> = '' && CH <= 'Z')){//キーワード又は識別子が判定された場合 ((CH> = '' && CH <= 'Z')||(CH> = '' && CH <= 'Z')||(CH> = '0' && CH <= '9')){一方 word.append(CH)。 CH = str.charAt(インデックス++)。 } index--; //ロールバックマーク SYN = 25。 文字列s = word.toString()。 //判断したキーワード 以下のために(INT i = 0; iは<keyWords.length; iは++){ IF(s.equals(キーワード[I])){ SYN = I + 1。 ブレーク; } } } //デジタルであると判断 他の()(CH> = '0' && CH <= '9')であれば{ 合計= 0; {((CH> = '0' && CH <= '9'))、一方 合計=合計* 10 + CH-'0' ; CH = str.charAt(インデックス++)。 } index--; SYN = 26。 } //文字のさまざまな裁判官 他のスイッチ(CH){ ケース '<': word.append(CH)。 CH = str.charAt(インデックス++)。 //は、<=かどうかを決定します {(CH == '=')場合 word.append(CH)。 SYN = 35。 } //かどうかを判断し、<> それ以外の場合は(CH == '>'){ word.append(CH)。 SYN = 34。 } //が決定します< 他の{ SYN = 33。 index--; } ブレーク; ケース '>': word.append(CH)。 CH = str.charAt(インデックス++)。 //は> =かどうかを決定します {(CH == '=')場合 word.append(CH)。 SYN = 37。 } //裁判官> 他の{ SYN = 36。 index--; } ブレーク; ケース '*': word.append(CH)。 CH = str.charAt(インデックス++)。 // **かどうかを判断します IF(CH == '*'){ word.append(CH)。 SYN = 31。 } //裁判官* 他の{ SYN = 13。 index--; } ブレーク; ケース '=': word.append(CH)。 CH = str.charAt(インデックス++)。 // ==かどうかを判断します {(CH == '=')場合 SYN = 32。 word.append(CH)。 } //裁判官= 他の{ SYN = 38。 index--; } ブレーク; ケース '/': word.append(CH)。 CH = str.charAt(インデックス++)。 //これはコメントであるかどうかを判断 {(CH == '/')であれば しばらく(CH!=」「){ CH = str.charAt(インデックス++); //スペースがあるか否かを判断します } SYN = -2。 ブレーク; } //裁判官/ 他の{ SYN = 30。 index--; } ブレーク; //裁判官+ 場合 '+': シン= 27; word.append(CH)。 ブレーク; //裁判官 - ケース ' - ': シン= 28; word.append(CH)。 ブレーク; //裁判官; ケース ';': SYN = 41。 word.append(CH)。 ブレーク; //裁判官( ケース '(': SYN = 42。 word.append(CH)。 ブレーク; //裁判官) ケース ')': SYN = 43。 word.append(CH)。 ブレーク; //裁判官の# ケース '#': SYN = 0; word.append(CH)。 ブレーク; //裁判官を入力します。 ケース '\ n' は: SYN = -2。 word.append(CH)。 ブレーク; //コードをまくしないでください デフォルト: シン= -1; } } }
結果: