2017-05-22 2 views
0

이것은 학교 과제물입니다. 나는 올바른 방향으로 한 지점을 찾고 있습니다. 어쩌면 나는 그것을 볼 때 대답을 인식하지 못하고있을뿐입니다 (인터넷 검색).나중에 실행할 수 있도록 데이터 구조를 파싱하려면 어떻게해야합니까? (플렉스 - 들소)

문법을 구문 분석하고 즉시 {action}을 (를) 수행하는 대신, 모든 것을 나중에 실행하기 위해 데이터 구조로 푸시하고 싶습니다. 예를 들면 다음과 같습니다. IF-cond-stmt-ELSE-stmt, 정상적으로 구문 분석 될 때 두 stmt가 실행됩니다. 나는 어딘가에 넣을 수 있다면, 나는 어떤 일이 일어날지를 통제 할 수있을 것이라고 생각한다.

나는베이스를 벗어 났습니까?

답변

0

그건 완전히 맞습니다.

데이터 구조를 만드는 일반적인 방법은 해당 노드를 루트로하는 서브 트리에 $$ (즉, 프로덕션의 의미 적 값)을 설정하여 트리 구조로 빌드하는 것입니다. 예를 들어

:에 걸릴 수있는 많은입니다

%{ 
typedef 
    struct Operation { 
    short type; 
    short operator; 
    union { 
     struct { 
     struct Operation* left; 
     struct Operation* right; 
     }; 
     Identifier* id; 
     // ... other possible value types 
    }; 
    } Operation; 
    Operation* new_binary_node(int operator, Operation* left, Operation* right) { 
    Operation* subtree = malloc(sizeof *subtree); 
    subtree->type = BINOP; 
    subtree->operator = operator; 
    subtree->left = left; 
    subtree->right = right; 
    } 
    Operation* new_identifier_node(Identifier* id) { 
    Operation* subtree = malloc(sizeof *subtree); 
    subtree->type = IDENTIFIER; 
    subtree->id = id; 
    } 
    void free_node(Operation* subtree) { 
    if (subtree) { 
     switch (subtree->operator) { 
     case BINOP: free_node(subtree->left); 
        free_node(subtree->right); 
        break; 
     case IDENTIFIER: 
        free_identifier(subtree->id); 
        break; 
     // ... 
     } 
     free(subtree); 
    } 
    } 
%} 

%union { 
    Operator* op; 
    Identifier* id; 
} 

%type <op> expr 
%token <id> IDENTIFIER 
%left '+' '-' 
%left '*' '/' 
/* ... */ 
%% 
expr: expr '+' expr { $$ = new_binary_node('+', $1, $3); } 
    | expr '-' expr { $$ = new_binary_node('-', $1, $3); } 
    | expr '*' expr { $$ = new_binary_node('*', $1, $3); } 
    | expr '/' expr { $$ = new_binary_node('/', $1, $3); } 
    | IDENTIFIER { $$ = new_identifier_node($1); } 
    | '(' expr ')' { $$ = $2; } 
/* ... */ 
+0

! 그러나 그것이 의미가 있습니다 (또는 그것이 안으로 가라 앉을 때). 정말 고맙습니다. –

관련 문제