2013-08-23 1 views
2

의 어휘 분석기를 작성하고, 소스 코드는 여기 -내가이 프로그램은 토큰으로 변환하는 입력으로 다른 프로그램을 읽어 C. 의 어휘 분석기를 만들려고하고 C

#include <stdio.h> 
#include <conio.h> 
#include <string.h> 

int main() { 
    FILE *fp; 
    char read[50]; 
    char seprators [] = "\n"; 
    char *p; 
    fp=fopen("C:\\Sum.c", "r"); 

    clrscr(); 

    while (fgets(read, sizeof(read)-1, fp) !=NULL) { 
     //Get the first token 
     p=strtok(read, seprators); 

     //Get and print other tokens 
     while (p!=NULL) { 
      printf("%s\n", p); 
      p=strtok(NULL, seprators); 
     } 
    } 

    return 0; 
} 

그리고있다 Sum.c의 내용은 다음과 같습니다.

#include <stdio.h> 

int main() { 
    int x; 
    int y; 
    int sum; 

    printf("Enter two numbers\n"); 
    scanf("%d%d", &x, &y); 

    sum=x+y; 

    printf("The sum of these numbers is %d", sum); 

    return 0; 
} 

올바른 출력을 얻지 못하고 출력 대신 공백 화면 만 표시됩니다.

아무도 내가 잘못 가고 있다고 말할 수 있습니까? 미리 감사드립니다.

+1

파일이 정상적으로 열리도록하십시오. 당신은 결코 그것을 체크하지 않고, 런타임에서의 현재 작업 디렉토리는 당신이 생각하는 것과 다르다. 특히 IDE 또는 다른 툴에서 실행하는 경우에 그렇다. 'fopen()'이 성공했는지 확인하고, 그렇지 않으면'perror ("파일을 열지 못했습니다.");와 종료하십시오. 적어도 그게 문제라는 것을 알게 될 것입니다. – WhozCraig

+0

토큰을 인쇄하려면'seprators' 값의 선택이''\ n ";'가 잘못되었습니다. –

+1

어휘 분석기를 실제로 만들고 싶다면 Flex (http://en.wikipedia.org/wiki/Flex_lexical_analyser) – Michael

답변

0

이번 질문 이후 몇 가지 질문을 했으므로 앞으로 나아갈 것입니다. 문제에 대해 언급 할 수있는 몇 가지 사항과 다른 사람들이 비슷한 문제를 해결하기 시작하는 데 도움이되는 솔루션에서 시작하는 방법이 있습니다. You'll also find that people can often be slow at answering things that are obvious homework. 숙제 마감 시간이 지날 때까지 우리는 종종 기다립니다. :-)

먼저, 나는 당신이 볼랜드 C 컴파일러에 특화된 몇 가지 기능을 사용했는데, 이는 비표준이며 솔루션을 이식성이 있거나 일반적인 것으로 만들지는 않을 것이라고 언급했다. 당신은 그들없이 문제를 해결할 수 있습니다. 그것은 보통 좋은 선택입니다. 예를 들어 #include <conio.h>clear the screen with a clrscr();으로 사용했는데 이는 아마도 불필요하고 렉서 문제와 관련이 없습니다.

나는 프로그램을 테스트했으며 작성된대로 작동합니다! 파일 Sum.c의 모든 행을 stdout에 복사합니다. 빈 화면 만 보았다면 파일을 찾을 수 없기 때문입니다. 둘 중 하나를 C:\ 디렉토리에 쓰거나 다른 이름을 쓰지 않았습니다. @WhozCraig에 의해 이미 언급 된 바와 같이 you need to check that the file was found and opened properly.

나는 C 함수 strtok을 사용하여 입력을 토큰으로 나누는 것을 볼 수 있습니다. 간단한 케이스 이상을 수행하는 일부 nice examples of using this in the documentation you could include in your code이 있습니다. @Grijesh Chauhan에 의해 언급 된 것처럼, \n, 또는 end-of-line보다 더 많은 분리 기호가 고려됩니다. 공백과 탭은 어떨까요?

그러나 프로그램에서는 항상 공백과 줄로 구분되지는 않습니다. 이 예제를 보자

result=(number*scale)+total; 

우리는 구분 기호로 공백을 사용한 경우, 그것은 사용되는 단어를 식별 할 것입니다 만 분명히 토큰 아닌 전체 표현식을 데리러. 구분 기호 목록에 다음을 추가 할 수 있습니다.

char seprators [] = "\n=(*)+;"; 

그런 다음 코드에서 해당 단어도 선택합니다. 이 전략에는 여전히 결함이 있습니다. 프로그래밍 언어에서 이러한 기호는 식별해야하는 토큰이기도합니다. 프로그래밍 언어 토큰 화의 문제점은 토큰간에 명확한 분리 기호가 없다는 것입니다.

이 배경에는 많은 이론이 있지만 기본적으로 우리가 인식하고자하는 토큰의 기본을 이루는 패턴을 적어두고 그 사이의 틈을 보지 않아야합니다. '아무! 이러한 패턴은 일반적으로 regular expressions로 작성됩니다. 컴퓨터 과학 이론은 우리가 finite state automata을 사용하여 이러한 정규 표현식과 일치 할 수 있다고 말합니다.

while (NOT <<EOF>>) { 
    switch (next_symbol()) { 

    case state_symbol[1]: 
       .... 
      break; 

     case state_symbol[2]: 
       .... 
       break; 

     default: 
      error(diagnostic); 
    } 
} 

그래서 지금, 아마 학문적 과제의 값이 명확하게 :이 스타일이 Writing a lexer involves a particular style of coding.

+0

그런 광범위한 대답을 해주셔서 대단히 감사합니다 ... 나는 문자 그대로 옮겨 갔지만이 대답으로 인해 나는 그 중요성을 이해하게되었습니다. 우리가 대학원에서 돌아간 연구 과제 중 .... – plutonium1991

관련 문제