다섯 번째 작업 - 설계 및 어휘 분석 프로그램의 구현 (20191010)

어휘 분석 프로그램 ( 어휘  분석기 ) 요구 사항 :

- 문자로 구성된 소스 프로그램에서 스트림은 왼쪽에서 오른쪽으로 스캔

- (단어의 사전 적 의미를 파악 어휘를 )

- 반환 단어 레코드 (단어 클래스, 단어 자체)

- 여과 공백

- 의견을 건너

- 어휘 오류 발견

 

프로그램 구조 :

입력 : 문자 스트림 (입력 어떤 방식으로, 데이터 구조가 저장된 어떤)

치료 :

- 트래버스 (무엇 통과)

- 어휘 규칙

출력 : 워드 스트림 (어떤 출력 양식)

- 튜플

 

워드 클래스 :

1. 식별자 (10)

부호 2 (11)

3. 단어 (단어 일야드)를 남겨

4. 운영자 (워드 일야드)

5. 구분 기호 (워드 일야드)

 

워드 기호

종은 코드를하지 않습니다

워드 기호

종은 코드를하지 않습니다

시작

1

:

(17)

만약

=

(18)

그때

<

(20)

동안

4

<=

(21)

하다

5

<>

(22)

종료

6

>

(23)

L (L | d) *

(10)

> =

(24)

DD *

(11)

=

(25)

+

(13)

;

(26)

-

(14)

(

(27)

*

(15)

)

(28)

/

(16)

#

0

그녀는 자바로 작성된 자바 프로그래밍 언어의 사용에 익숙해 있었기 때문에 그래서 이것은 어휘 분석 절차입니다. 그들에 해당하는 문자 코드의 다른 종류로, 각각 디지털 분리기를 구분합니다.

프로그램 코드 :

수입 java.io.BufferedReader의; 
수입 때 java.io.IOException; 
수입 java.io.InputStreamReader; 
수입 java.util.Scanner; 

공용 클래스 LexicalAnalyzer { 

    정적 문자열 [] 키워드 = 새로운 String [] { "주", "만약", "다음", "동안", "고정", "어떻게" 
                                "지능", "더블", "구조체" "휴식", "다른 사람", 
                                "긴", "스위치", "경우", "형식 정의", "문자", 
                                "반환", "CONST", "플로트", "짧은", "계속", 
                                " 에 대한 ","} "", "무효를 sizeof;
    정적의 StringBuilder 워드 = 새의 StringBuilder ( " "); //은 , 모두 StringBuilder 구축 문자 메시지를 읽기가 용이하게하기 위해 첨가된다 
    {공공 정적 무효 메인 (문자열 []에 args)를 
    	 , 인덱스 = 0 
    	 = 행 1]. // 첫 번째 행부터 검색을 시작하는 
   	 시스템 .out.println ( "C 언어 소스 코드 문자열 (# 기호 끝)를 입력하세요 :"); 
       을, BufferedReader을, BufferedReader 새로운 새로운 BF =합니다 (InputStreamReader 새로운 새로운합니다 (System.in)을) 
       은 try은 { 
           {할 
           	문자열 TestStr을, 
           	TestStr = BF를 .readline (); 
               STR + = TestStr, 
               CH = testStr.charAt (testStr.length () - 1.); // 단어의 마지막 문자 읽기 
           (! CH의 = '#');}는 동안         
       } 캐치 (IOException가 E를) { 
           e.printStackTrace (); 
       } 
       인덱스 = 0; 표제어 문자 재설정 //
       {수행 
    	   분석기 (); 
        (동안 채널 == '') {
    	   디지털 // 출력 코드의 다른 타입의 
           경우 {(SYN 26 ==이다) 
           	]에서 System.out.println ( "("+ SYN + ','+ SUM + ")") 
			} 
           {- 다른 IF (. 1 SYN ==) 
           	시스템. out.println ( "종은 기호를 코드화하지 않습니다!"); 
			} 
           다른 IF (SYN의 ==를 - 2) { 
			} 
           그렇지 않으면 { 
           	에서 System.out.println ( "("+ SYN + ","+ + 단어 ") "); 
			} 
       }을 잠시 (SYN = 0) ;! 
   } 

    정적 무효 분석기 () { 
    	워드 비우는 // 
    	, word.length을 word.delete (0 ());           
        CH = str.charAt (인덱스 ++); // 문자 단어 당 얻기 
        공간 // 건너 
            CH = str.charAt (인덱스 ++);       
        }
        경우 ((CH2> = '는 '&& CH <= 'Z') || (CH2> = 'A'&& CH <= 'Z')) {// 키워드 또는 식별자가 결정되는 
            반면 ((CH2> = ' 0 && CH <= '. 9') || (CH> = '&& CH <='Z ') || (CH> ='A A '&& CH <='는 Z ')) { 
            	word.append (CH); 
                str.charAt = CH (인덱스 ++); 
            } 
            인덱스 // 롤백 플래그 
            SYN = 25;       
            문자열 word.toString S = (); 
            // 키워드 판정 
            대해 INT (I = 0; I <keyWords.length ; I ++) { 
                (대해서는 s.equals은 (키워드 [I]가)) {IF      
                    SYN가 = I + 1]. 
                    BREAK;        
                } 
            }는 
        } 
        // 디지털 판정
        다른 IF ((CH> = 0 && CH <= '. 9')) { 
                word.append (CH);
            0 = SUM; 
            그동안 (. '9'(CH> = 0 && CH <=)) { 
                SUM = SUM은 + 10 *의 CH-'0 '; 
                CH = str.charAt (인덱스 ++); 
            } 
            인덱스; 
            SYN = 26 
        } 
        // 다양한 문자 판정 
        다른 스위치 (CH) { 

        '<'케이스 
            ; word.append (CH) 
            , CH = str.charAt (인덱스 ++) 
            // 여부를 판정 <= 
            '== 만약에 (CH = ') { 
                word.append (CH) 
                , SYN = 35 
            } 
            //> <여부를 판정 
            >') {(가) 그 밖의 경우 (CH는 == '
            } 
            // 결정 <
                = 34 SYN이다 
          // 여부를 결정 **
            또 { 
                SYN = 33; 
                인덱스--; 
            } 
            휴식; 
        케이스 '>' 
        	word.append (CH); 
            CH = str.charAt (인덱스 ++); 
          //判断是否是> = 
            경우 (CH2 == '=') { 
            	word.append (CH); 
                SYN = 37; 
            } 
          //判断是> 
            다른 { 
                SYN = 36; 
                인덱스--; 
            } 
            휴식; 
        경우에 '*' 
        	word.append (CH); 
            CH = str.charAt (인덱스 ++); 
            (CH2 == '*') {경우 
            	word.append (CH); 
                SYN = 31이다 
            } 
          // 판정 * 
            가 다른 { 
                SYN = 13이다 
                인덱스; 
            } 
            BREAK, 
        케이스 '=' 
        	word.append (CH ) 
            CH = str.charAt (인덱스 ++); 
          //는 == 여부를 결정한다 
            {(CH == '=') 경우 
                , SYN = 32 
                word.append (CH); 
            } 
          // 판정 = 
            가 다른 { 
                SYN가 = 38 , 
                인덱스; 
            } 
            BREAK; 
        케이스 '/' 
        	word.append (CH) 
            CH = STR. 수 charAt (인덱스 ++); 
          // 여부를 판정 코멘트 
            (CH2 == '/') 경우에 {
                그동안 (CH는 = '!') { 
                    ; CH = str.charAt (인덱스 ++) // 공간이 있는지 여부를 판단한다 
                } 
                ; SYN = -2 
                BREAK; 
            } 
          // 결정된다 / 
            다른 { 
                SYN = 30, 
                인덱스; 
            } 
            BREAK; 
          // + 판정 용 
        케이스 '+' 
            SYN = 27; 
            word.append (CH); 
            BREAK, 
        케이스 ' '': 
            SYN 41 인 =; 
          // 판정 -
        케이스 '-' 
            SYN = 28; 
            word.append (CH); 
            BREAK; 
          // 판정; 
            word.append (CH); 
            BREAK; 
          // 판정 ( 
        케이스 '(' 
            SYN가 = 42이다 
            word.append ( CH) 
            BREAK; 
          // 판사) 
        케이스 ')' 
            SYN가 = 43이다 
            word.append (CH); 
            BREAK; 
          // 판정 #의 
        케이스 '#' 
            SYN = 0; 
            word.append (CH); 
            BREAK ; 
          // 캐리지가 결정된다 
        케이스 '\ N-' 
            SYN = -2;
            word.append (CH), 
            BREAK; 
            // 어떤 종의 다른 코드 
        기본 : 
            SYN = -1;  
        } 
    }
    }
   

  결과 :

추천

출처www.cnblogs.com/codekid/p/11655717.html