2012-10-24 7 views
0

저는 컴파일러를 작성 중이며 무한히 중첩 된 if 문을 처리하기위한 코드가 있지만 해킹과 같은 문제가 있습니다. 이 일을하는 것이 안전한지 나는 모른다.들소에 대한 안전한 프로그래밍인가요?

con_statement: 
IF exp DO 
{ 
    $1 = ifNum++; 
    if($2 == BOOLEAN_TYPE || $2 == INTEGER_TYPE) 
    { 
     utstring_printf(code, "\tpop\teax\n"); 
     utstring_printf(code, "\tcmp\teax, 0\n"); 
     utstring_printf(code, "\tje\tIF_END_%d\n", $1); 
    } 
    if($2 == FLOAT_TYPE) 
    { 
     utstring_printf(code, "\tnop\n"); 
    } 
} 
program FI 
{ 
    utstring_printf(code, "IF_END_%d:\n", $1); 
} 
; 
+0

무엇이 중요합니까? 라벨 생성? 코드 생성? 규칙의'프로그램'부분은 무엇입니까? ELSE 절을 어떻게 처리하는지는 분명하지 않습니다. 아마도 문제가되지는 않지만 종종 그렇습니다. –

+0

$ 1 = LABELNUM이라고 말하면서 터미널을 타이핑하면 나에게 나쁜 꼴통 같아? 죄송합니다. 입력을 완료하는 걸 잊었습니다. – SetSlapShot

+1

기본 동작은'$$ = $ 1;'을 (를) 설정하기 때문에'$ 1'을 (를) 사용하여 dinking하면 업스트림에 영향을 미치지 만 Yacc 코드에는 영향을 미치지 않습니다. 그것은'con_statement'에 의해 반환 된 값을 봅니다. 레이블 번호를 현재 구문과 연결하는 메커니즘을 만드는 것이 더 일반적이라고 생각합니다. 네가하고있는 일은 독창적이라고 생각해. 나중에 그것이 당신에게 파급 효과를 줄 것이라고 생각합니다. 하지만 나는 Yacc 그 자체를 깨뜨리지 않을 것이라고 생각합니다. –

답변

1

이 잘 작동하지만 $$ 사용하는 IMO 명확 것/$ 4 : 다음

con_statement: 
IF exp DO 
{ 
    $$ = ifNum++; 
    if($2 == BOOLEAN_TYPE || $2 == INTEGER_TYPE) 
    { 
     utstring_printf(code, "\tpop\teax\n"); 
     utstring_printf(code, "\tcmp\teax, 0\n"); 
     utstring_printf(code, "\tje\tIF_END_%d\n", $$); 
    } 
    if($2 == FLOAT_TYPE) 
    { 
     utstring_printf(code, "\tnop\n"); 
    } 
} 
program FI 
{ 
    utstring_printf(code, "IF_END_%d:\n", $4); 
} 
; 

첫 번째 작업은 (는 $$에두고) 값을 생성하고, 나중에 작업을 할 수 그 값에 액세스하십시오.

다른 방법으로 (그리고 당신이 다른 지원하려는 경우 특히)는 별도의 생산에이 초기 조치를 분할하는 의미가 있습니다

con_statement: 
    if_head program FI 
    { utstring_printf(code, "IF_FALSE_%d:\n", $1); } 
| if_head program ELSE 
    { utstring_printf(code, "\tjmp\tIF_END_%d\n", $1); 
     utstring_printf(code, "IF_FALSE_%d:\n", $1); } 
    program FI 
    { utstring_printf(code, "IF_END_%d:\n", $1); } 
; 

if_head: 
    IF exp DO 
    { $$ = ifNum++; 
      : 
; 

이 경우 일반에 대해 동일한 작업을 사용 할 수 있으며/다른 경우 문법 충돌을 피하십시오. IF..DO을 구문 분석하는 시점에서 ELSE이 있는지 여부는 알 수 없습니다.