0

에서 변수를 저장하는 방법, 파이썬의 작은 부분 집합에 대한 컴파일러를 작성해야 :기호 표 컴파일러 내 클래스에 대한

  • 이 언어는 하나의 방법
  • 이 기능이 아니므로했다 I 하나의 어휘 범위만을 다루고 있습니다.

이 파이썬 서브 세트는 자바 바이트 코드로 변환 될 것입니다. 나는 이미 렉시 컬 분석과 파싱 트리 (lex 및 yacc 사용)를 수행했습니다. 코드 생성과 관련되어 있습니다.

우리는 코드 생성을 위해 Gnoloo을 스택 기계 언어로 사용하고 있습니다.

문제는 변수를 저장하는 방법을 모른다는 것입니다. 나는 심볼 테이블을 사용해야 만한다는 것을 알고 있지만 그것을 채울 방법을 모른다.

변수의 값을 저장해야합니까?

코드에 x = 2이 있으면 symtable에 필드가 있어야합니까?

어떻게 스택 머신의 변수를 저장할 수 있습니까?

+0

당신이 무엇을 요구하고 있는지 분명하지 않습니다. 당신이 받아 들인 대답으로 판단하면, 컴파일 타임 심볼 테이블을 만드는 방법을 묻고 있습니다. 스택 머신은 질문에 전혀 관련이 없으며 코드 생성에 매달리지 않고 심볼 테이블에 머물러 있습니다. 건물. 귀하의 질문에 대한 대답은 코드 생성기를 통해 스택 머신의 객체 코드에 변수를 저장하는 방법 인 것 같습니다. – EJP

답변

0
당신은 당신이, C++ 또는 C

C++를 사용중인 언어 말했다하지 않은

: C++에서

관리 변수는 오히려 간단합니다, 당신은 기본적으로해야합니다 하나 개의 맵 std::map<string,int> symbol_table; (가정하여 변수는 정수). 처음에는 변수를 사용할 때지도에 삽입하고 선언 할 때마다지도에서 값을 업데이트합니다. 이것은 C++에서 정말 빠르게 작동합니다. 물론 Yacc 파서에서이 값을 추가/업데이트 할 수 있습니다.

C : C 상황에서

가 조금 까다 롭습니다, 더지도가 없습니다! 따라서 바이너리 검색 트리를 생성해야합니다. 해당 트리의 노드에는 변수 이름을 나타내는 문자 배열이 포함되며 일부 값이 있습니다. 처음으로 변수를 BST에 추가해야하는 경우 변수를 찾을 때 먼저 변수를 찾아서 노드의 값을 업데이트해야합니다.

참고 :이 문제는 이름 메모리 할당 메모리 할당에 문제가 C에서있다, 당신은 일반적으로 렉스에 .`

(다행히도 그것에 대해 strdup 기능이있다) 나는 생각하지 않는다 그렇게 코드 예제는 C++에서 필요하지만 C에서 예제를 제공 할 것입니다.

Yacc에 시작 :

%{ 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include "tree.h" /* All methods I mentioned above must be implemented */ 

    node *map = NULL; /* You would insert every variable here */ 

%} 

연합 (EU) :

%union { 

    char *s; /* We will allocate memory in Lex */ 
    int value; /* We will update this value in Yacc */ 
}; 

렉스 : 기본적입니다

[a-zA-Z_][a-zA-Z0-9_]* { 

    yylval.s = strdup(yytext); 
    if(yylval.s == NULL){ 

     fprintf(stderr,"Unable to allocate memory for variable name.\n"); 
     exit(EXIT_FAILURE); 
    } 

    return id_token; 
} 

. 이 일을하기 위해서해야 할 일이 있습니다. 추가 질문이 있으면 언제든지 물어보십시오.

+0

감사합니다!, 나는 자바를 사용하고 있습니다. 내 문제는 내가 스택 머신에 대한 코드를 생성해야한다는 것입니다. 소스 코드에는 다음 두 문장이 있습니다. x = 2 * 3 이상 y = 2 + x. x를로드 한 위치를 추적하는 방법을 모릅니다. 내가 어떻게 할 수 있니?. – MadDog

+0

그럼 해시 맵이나 사전을 사용할 수 있습니다. 기본적으로 C++에서 설명한 것과 같습니다. http://stackoverflow.com/questions/267312/difference-between-a-hashmap-and-a-dictionary-adt 해시지도 및 사전에 대한 자세한 내용은 여기를 참조하십시오. –