어휘 분석 프로그램 ( 어휘 분석기 ) 요구 사항 :
- 문자로 구성된 소스 프로그램에서 스트림은 왼쪽에서 오른쪽으로 스캔
- (단어의 사전 적 의미를 파악 어휘를 )
- 반환 단어 레코드 (단어 클래스, 단어 자체)
- 여과 공백
- 의견을 건너
- 어휘 오류 발견
프로그램 구조 :
입력 : 문자 스트림 (입력 어떤 방식으로, 데이터 구조가 저장된 어떤)
치료 :
- 트래버스 (무엇 통과)
- 어휘 규칙
출력 : 워드 스트림 (어떤 출력 양식)
- 튜플
워드 클래스 :
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; } } }
결과 :