간단한 while 문을 C 언어 (ANSI 89)에서 & t의 어셈블리로 변환하는 프로그램의 yacc 소스 파일을 작성하려고합니다. 다음은 yacc 파일의 중심 부분 인 내 문법입니다.yacc을 사용하여 while 문을 c에서 assembly로 변환
%%
while_statement : 'w' 'h' 'i' 'l' 'e' '(' control_statement ')' '{' block '}'
{printing of the assembly code;}
control_statement : expression '>' expression { $$ = strcat(write exp jg back,) ;}
| expression '<' expression { $$ = strcat(write exp jl back,) ;}
| expression '==' expression { $$ = strcat(write exp je back,) ;}
| expression '<=' expression { $$ = strcat(write exp jle back,) ;}
| expression '>=' expression { $$ = strcat(write exp jge back,) ;}
| expression '!=' expression { $$ = strcat(write exp jne back,) ;}
| expression { $$ = $1;}
block : expression ';'
| block expression ';'
expression : expression '+' expression { $$ = $1 + $3;}
| expression '-' expression { $$ = $1 - $3;}
| expression '*' expression { $$ = $1 * $3;}
| expression '/' expression { if($3 == 0)
yyerror("divide by zero");
else
$$ = $1/$3;}
| '-' expression { $$ = -$2;}
| '(' expression ')' { $$ = $2;}
| string '=' expression { create new variable called string with expression value }
| number { $$ = $1;}
string : letter {$$ = $1;}
| string letter {strcat($$, ??;}
letter : A {strcat($$, 'A');}
.........
number : digit { $$ = $$ + $1;}
| number digit { $$ = ($1 * 10) + $2;}
digit : '0' {$$ = 0;}
| '1' {$$ = 1;}
| '2' {$$ = 2;}
| '3' {$$ = 3;}
| '4' {$$ = 4;}
| '5' {$$ = 5;}
| '6' {$$ = 6;}
| '7' {$$ = 7;}
| '8' {$$ = 8;}
| '9' {$$ = 9;}
%%
제 질문은 : 마지막 종류의 문자열 값을 연결하는 데 사용해야하는 종류의 기능입니까? 또는 어떤 종류의 데이터 형식, 구조체, 공용체 등을 사용해야합니까? 미리 답변 해 주셔서 감사합니다.
+1하지만 조건 테스트를 끝까지 넣고 분기 테스트로 시작하는 것이 좋습니다. 그렇게하면 반복 당 하나의 점프 만 있습니다. 또한 do/while에 대한 코드와 동일하게되며 초기 점프가 추가됩니다. – EJP