당신은 당신이, 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;
}
. 이 일을하기 위해서해야 할 일이 있습니다. 추가 질문이 있으면 언제든지 물어보십시오.
당신이 무엇을 요구하고 있는지 분명하지 않습니다. 당신이 받아 들인 대답으로 판단하면, 컴파일 타임 심볼 테이블을 만드는 방법을 묻고 있습니다. 스택 머신은 질문에 전혀 관련이 없으며 코드 생성에 매달리지 않고 심볼 테이블에 머물러 있습니다. 건물. 귀하의 질문에 대한 대답은 코드 생성기를 통해 스택 머신의 객체 코드에 변수를 저장하는 방법 인 것 같습니다. – EJP