나는 들소에서 문법을 설명하려고하지만 할 수 있는지 확신 할 수 없습니다.간단한 (?) 문법의 시프트 감소 충돌
%token A B C D SEP
%%
items : /* empty */
| items_nonempty
;
items_nonempty : item
| items_nonempty SEP item
;
item : B
| B SEP D
| B SEP C
| B SEP C SEP D
| A SEP B
| A SEP B SEP D
| A SEP B SEP C
| A SEP B SEP C SEP D
;
는 "items
"는 SEP
토큰 분리 item
요소의 (가능한 빈) 시퀀스이다 : 내 의도 문법이있다.
각 항목은 SEP
으로 분리 된 순서로 최대 4 개의 토큰 (A B C D
)으로 구성됩니다. 항목에있는 A
, C
및 D
토큰은 선택 사항입니다.
각 항목 내에서와 항목 자체간에 동일한 구분 기호 토큰 SEP를 다시 사용합니다.
의도 한 문법이 분명하기를 바랍니다. 나는 그것이 모호하지 않다고 생각하지만 바이슨에 의해 분석 될 수있을만큼 충분히 제한적인지는 확신 할 수 없다. 불행히도 파서 지식은 꽤 녹슬다.
주어진대로 문법을 사용하면 bison은 4 개의 시프트/감소 충돌을보고합니다. '산출물'을 보면 나는 그들이 어디에서 발생했는지, 왜 그런지를 이해한다. 하지만 S/R 충돌을 없애기 위해 의도 된 문법을 작성하는 방법 (및 가능한 경우)을 놓치고 있습니다.
%expect
선언을 사용하지 않을 것입니다. 마찬가지로, 나는 스캐너가 파서에 넘겨지기보다는 분리 자 토큰을 소비하게 내키지 않는다.
이 문법을 위생 처리하는 방법에 대한 힌트를 크게 주시면 감사하겠습니다.