2017-11-18 10 views
0

Bison 컴파일러가 'routine'의 $ 0 오류를 반환합니다. 선언 된 유형이 없습니다. 글꼴을 선언하는 메시지를 인쇄하려고하므로 함수 본문을 인쇄하기 전에 여는 중괄호를 인쇄해야합니다. 나는이 문서를 읽고, 내가 해당 페이지에서 오는 해결책을 발견 :

%type <type_object> type 
: 나는 또한 비 터미널 '유형'에 대한 유형을 지정

fun_decl : 
    type routine fun {end_fonction();}; 

routine : 
    {declare_fonction($0);}; 

: Bison 3.0.4: Actions 그래서 나는 내 문제에 적용하려

내 실수가 어디에서 왔는지 이해할 수 없습니다.

NB : 비 터미널 루틴에 단순히 빈 명령어를 연결하면 bison도 "충돌로 인해 구문 분석기에서 쓸모가 없다"라는 실수를 반환합니다. 내가 빈 규칙을 여러 개 가질 수 없다는 뜻입니까?

fun_decl : 
    type {declare_fonction($1);} fun {end_fonction();}; 

이 들소는 $1의 유형을 알고있는 이점이있다 :

답변

2

당신은 단지 mid-rule action가 사용할 수 있습니다. 일반적인 경우에는 가능하지 않기 때문에 $0의 유형을 파악하려고 시도하지 않습니다.

매뉴얼에서 설명했듯이 규칙 중간 동작은 시프트 감소 충돌을 만들 수 있습니다. routine과 같은 "마커"(비어있는) 비 터미널도 shift-reduce 충돌을 만들 수 있으며 대략 비슷한 상황에서 발생할 수 있습니다. 그러나 그것은 다른 질문이 될 것입니다.

+0

좋아, 즉 그래도 이상해. – Vito

0

방금 ​​내 문제에 대한 해결책을 찾았습니다. Bison에 스택을 가져올 크기를 알리려면 $ 0 유형을 지정해야했습니다. 내 경우 :

routine : 
    {declare_fonction($<type_object>0);}; 
+0

조심해야합니다. rici가 지적했듯이, Bison은 '$ 0'유형을 추측하려고하지 않습니다. 즉, 항상 동일하지는 않습니다 (현재 비 터미널에 어떻게 도달했는지에 따라 다름) - 귀하 또는 Bison이 문법을 검사하여 특정 문법에 대해 신뢰할 수 있는지 여부를 파악할 수 있습니다). 중간 규칙 작업 *은 파서가 항상 교대 작업을 수행하므로 작동하도록 보장됩니다. – torek

+0

나는 그것이 왜 바이슨 의사에게 쓰여졌는지 이해할 수 없다. '루틴'은이 방법으로 만 불려지므로이 비 터미널을주의 깊게 사용하는 한 내 의견에는 어떤 오류도 있어서는 안된다. . – Vito

+0

음, 그렇습니다. "주의해야합니다.": $ 0이 항상 type_object이고 아직 덮어 쓰지 않은 비 터미널을 사용하십시오. – torek

0

당신은 routine의 유형으로 선언되지 않은 : 나는 노력하겠습니다

%type <type_object> routine 
+0

루틴을 인수로 사용하지 않았기 때문에 나는 필요가 없다고 생각합니다. $ 0은 '유형'을 나타냅니다. 그것은 그것없이 잘 작동합니다. – Vito