2009-11-20 5 views
0

규칙을 매치 할 때마다 초기화 코드를 실행할 필요가 있다고해서 중복을 어떻게 줄일 수 있습니까?Yacc 문법 규칙 코드를 스택화할 수 있습니까?

rule : TOKEN1 { init(); token1Code(); } 
    | TOKEN2 { init(); token2Code(); } 
    ; 

또한이 정말 작동하기 때문에 가능

rule : TOKEN1 
    | TOKEN2 
    { codeForToken1OrToken2(); } 
    ; 

답변

3

당신은 같은 것을 사용할 수 있습니다

rule : { init(); } real_rule { codeForToken1or2(); } ; 

real_rule : TOKEN1 { token1Code(); } 
      | TOKEN2 { token2Code(); } 
      ; 

을하지만이 '규칙'의 사용 방법에 따라 충돌을 초래할 수있다.

+0

이 문법은 DevDevDev 게시와 동일하지 않습니다. – eKek0

+0

동일한 언어를 사용할 수 있습니다. 따라서 해당 내용이 적용됩니다. –

+0

게시 한 원래 문법이 동일한 언어가 아닙니다. 이제 오류를 수정했습니다 – eKek0

0

처럼 뭔가를 할 수 있습니다 :

rule : TOKEN1 { getToken(); init(); token1Code(); } 
    | TOKEN2 { getToken(); init(); token2Code(); } 
    ; 

getToken();은 입력의 다음 토큰과 일치하는 함수의 이름입니다 (함수 이름을 기억하지 못합니다). init(); 안에이 있습니다.

+0

질문에 대답하지 않는 것 같습니다. –