2017-12-30 83 views
0

주어진 시리즈 내에서 특정 시퀀스를 식별 할 수 있는지 알고 싶습니다.주어진 시리즈에서 특정 시퀀스를 식별하는 규칙을 어떻게 정의 할 수 있습니까?

lex은 3 개의 다른 토큰, 즉 START, AMINO, STOP을 생성한다. YACC에 의해 START으로 시작하고 일련의 AMINO 토큰을 가지고 STOP으로 끝나는 모든 시퀀스를 확인하고 싶습니다. 예 : START AMINO AMINO ... AMINO STOP

내가 전에 YACC/bison을 사용한 적이, 그래서 나는 시도했다 :

%% 
seq_2: START seq_1 STOP {printf("%s", $2);}; 
seq_1: seq_1 AMINO 
%% 

그러나 이러한 규칙이 작동하지 않습니다.

  • lexYACC으로이 문제를 해결할 수 있습니까?
  • 가능한 경우 해결 방법은 무엇입니까?
+0

"작동하지 않음"이란 무엇을 의미합니까? 정교하게 주시겠습니까? 'seq_1'에 대한 의미 규칙은 무엇이되어야합니까? 그리고 당신은'seq_1'이 무한 재귀 규칙이라는 것을 알고 있습니다. 멈추는 것은 아무것도 없습니다. (나는 * 당신의 문제입니까?) 아마도 YACC에 대한 좋은 자습서를 찾아보아야 할 것입니다 (수천 명이 넘습니다)? 들소 설명서에는 그 자체로 아주 좋은 지침서가 있습니다. –

+0

규칙은 다음과 같이 말합니다 :'seq_2'를 만들기 위해서는 무엇보다도'seq_1'이 먼저 필요합니다. 'seq_1'을 만들기 위해서는'seq_1'이 먼저 필요합니다. 당신을 시작하게 할 아무 것도 없습니다. 문법을 만족시키는 것은 불가능합니다. – melpomene

+0

@Someprogrammerdude 문제는 'START'및 'STOP'으로 구분 된 시퀀스를 찾는 방법을 지정하는 규칙을 작성하는 방법에 관한 것입니다. 나는 튜토리얼과 핸드북을 읽었지만'YACC'에서이 규칙들을 어떻게 구현할 지 아직 명확하지 않다. – Simone

답변

2

'seq_1'규칙 끝에 세미콜론이 없기 때문에 오류가 발생했을 수 있습니다. 예 :

seq_1 : seq_1 AMINO ; 

또한 현재 가지고 계시므로 seq_1을 (를) 종료 할 수 없습니다. 터미널에 추가 규칙을 부여하여이를 수정할 수 있습니다.

는 'seq_1'당신이 할 수있는 다음 비어있는 유효한 경우 다음과 같이한다 : 그것은 더 일반적으로 기록 된대로,

seq_1 : seq_1 AMINO ; 
seq_1 : ; 

을 또는 :

seq_1 : seq_1 AMINO 
     | 
     ; 

경우가 항상해야 START와 STOP 사이에 적어도 하나 이상의 AMINO가 있으면 다음과 같이하십시오.

seq_1 : AMINO 
     | seq_1 AMINO 
     ;