2013-02-06 4 views
0

I가 하나 개 이상의 항목을 쉼표로 구분 된 목록에 대해 다음 문법 :Flex/Bison : 쉼표로 구분 된 연결된 목록?

column_expression_list: 
    column_expression { 
     $$ = LinkedList_New(); 
     LinkedListItem *item = LinkedListItem_New($1); 
     LinkedList_add($$, item); 
    } 
    | 
    column_expression_list T_COMMA column_expression { 
     LinkedListItem *item = LinkedListItem_New($3); 
     LinkedList_add($1, item); 
    } 
; 

column_expression_list 항상 궁극적으로 아래로 column_expression 따라서 연결된 각 목록 항목에 휴식 항상 링크 된 목록에 안전하게 추가됩니다합니까 ?

그렇지 않은 경우 올바른 문법이 무엇일까요?

+1

나는 괜찮아 보입니다. 개인적으로 목록에서 오른쪽 재귀를 사용했지만 ('column_expression T_COMMA column_expression_list') 대신. –

+0

@ JoachimPileborg 제안으로 인해 충돌이 발생합니다. 그렇게하는 데 성과가 있습니까? –

+1

물론'$ 1'과'$ 3'을 전환해야합니다. 다른 차이점은'column_expression' 노드가 추가 될 곳입니다. head 또는 tail. –

답변

1

당신의 문법은 괜찮습니다. 두 번째 규칙은 이미 "인정"되어야하기 때문에 두 가지 규칙 중 첫 번째 규칙보다 먼저 column_expression_list을 빌드 할 수있는 다른 방법은 없습니다. 물론 column_expression_list에 다른 규칙이있는 경우 상황이 다를 수 있습니다.

LR 파서의 경우 오른쪽 재귀보다 왼쪽 재귀를 선호합니다. 즉, 공간을 절약하고 대화 형 파서의 경우 원하는 방식으로 작동합니다. 예를 들어 http://www.gnu.org/software/bison/manual/html_node/Recursion.html을 참조하십시오.