cs
  • let's go
  • book
    • 컴파일러의 이해
      • 형식 언어와 유한 오토마타
      • 어휘분석
      • Untitled
    • 객체지향 사고 프로세스
      • Untitled
        • Untitled
          • Untitled
  • tip
    • 우분투 초기 세팅
    • Untitled
  • Hack
    • Binary
Powered by GitBook
On this page
  • Lexical Analyzer
  • Scanner Source Code (Lexical Analyzer)
  • Run

Was this helpful?

  1. book
  2. 컴파일러의 이해

어휘분석

Chapter 04

Lexical Analyzer

Scanner Source Code (Lexical Analyzer)

#include <stdio.h>

int isAlpha(char x){
    if(x >= 'A' && x <= 'Z') return 1;
    if(x >= 'a' && x <= 'z') return 1;
    return 0;
}

int isUnderbar(char x){
    if(x == '_') return 1;
    return 0;
}

int isNumber(char x){
    if(x >= '0' && x <= '9') return 1;
    return 0;
}

int main(){
    char string[100];
    int i = 0;

    printf("식을 입력하세요: ");
    fgets(string, 100, stdin);
    
    printf("수식: %s\n", string);

    for(int i = 0; string[i]; i++) {
        char tmp = string[i];

        if( isAlpha(tmp) || isUnderbar(tmp)) {
                printf("식별자: %c",tmp);
                
                while(1){
                    i++;
                    char tmp2 = string[i];
                    if(isAlpha(tmp2) || isUnderbar(tmp2) || isNumber(tmp2)) {
                        printf("%c", tmp2);
                    }
                    else
                        break;
                }
                printf("\n");
                printf("token num : 2\n");
            }
        if( isNumber(tmp) ) {
            printf("상수 : %c", tmp);

            while(1) {
                i++;
                char tmp2 = string[i];
                if(!isNumber(tmp2))
                    break;
                printf("%c",tmp2);
            }
            printf("\n");
            printf("token num : 4\n");
        }

        if(tmp == '+') {
            printf("연산자: +\n");
            printf("token num :6\n");
        }

        if(tmp == '-') {
            printf("연산자: -\n");
            printf("token num :7\n");
        }
        
        if(tmp == '*') {
            printf("연산자: *\n");
            printf("token num :8\n");
        }
        
        if(tmp == '/') {
            printf("연산자: /\n");
            printf("token num :9\n");
        }
        
        if(tmp == '=') {
            printf("연산자: =\n");
            printf("token num :10\n");
        }

        if(tmp == ';') {
            printf("구분자: ;\n");
            printf("token num :12\n");
        }

        if(tmp == '(') {
            printf("구분자: (\n");
            printf("token num :13\n");
        }
        if(tmp == ')') {
            printf("구분자: )\n");
            printf("token num :14\n");
        }
    }
}

Run

Lexical Analyzer(Scanner) gets source program as an input, and make token stream as an output for syntax analyzer

Previous형식 언어와 유한 오토마타NextUntitled

Last updated 4 years ago

Was this helpful?

scanning `ni = ba * po - 60 + ni / (ab12c_ddd +40);`