문제

Flex and Bison을 사용하여 Boolean Query 언어에 대한 문법 사양이 있습니다.이 언어는 논리적 "및"또는 "또는"및 "Not"작업 및 "()"를 사용하는 중첩 하위 표현을 지원합니다.

"A 및 B 또는 C 및 D"와 같은 쿼리가 "(a & b) | (c & d)"로 구문 분석하려는 "A & (C & D)"와 같은 쿼리가 실제로 "a & (b | CD ) )". 나는 이것이 연관성 문제라고 거의 확신하지만, 어느 곳에서나 적절한 설명이나 예를 찾을 수없는 것 같습니다.

boolpars.y의 관련 정보 :

%token TOKEN
%token OPEN_PAREN CLOSE_PAREN
%right NOT
%left AND
%left OR

%%

query:      expression                          { ... }
            ;

expression: expression AND expression           { ... }
            | expression OR expression          { ... }
            | NOT expression                    { ... }
            | OPEN_PAREN expression CLOSE_PAREN { ... }
            | TOKEN                             { ... }
            ;

누구든지 결함을 찾을 수 있습니까? Bison이 왜주지 않는지 "또는"적절한 우선 순위를 알 수 없습니다.

도움이 되었습니까?

해결책

들소 문서에서 :

연산자 우선 순위는 선언의 선 순서에 의해 결정됩니다. 선언의 줄 수가 높을수록 (페이지 또는 화면의 낮은) 선례가 높아집니다.

따라서 귀하의 경우 화면에서 더 낮고 우선 순위가 높습니다. 순서를 변경하십시오

%left OR
%left AND

(그래도 테스트하지 않았습니다)

다른 팁

이 스 니펫에서 C-ish 언어에서와 같이 제작물을 나누지 않겠습니까?

logical_AND_expression:
    inclusive_OR_expression
    | logical_AND_expression ANDAND inclusive_OR_expression
            {$$ = N2(__logand__, $1, $3);}
    ;

logical_OR_expression:
    logical_AND_expression
    | logical_OR_expression OROR logical_AND_expression
            {$$ = N2(__logor__, $1, $3);}
    ;

내 자신의 구현과 테스트에서 테스트를 수행했습니다. Marcin의 대답 맞다. 우선 순위를 다음과 같이 정의하는 경우

%left OR
%left AND

그런 다음 표현식 a & b | c & d는 ((a & b) | (c & d)로 축소됩니다.

우선 순위를 다음과 같이 정의하는 경우

%left AND
%left OR

그런 다음 표현식 a & b | c & d는 ((a & (b | c)) & d로 감소됩니다.

하나의 차별화 된 표현은 다음과 같습니다.

true & true | true & false

전자 우선 순위 정의는 이것을 사실로 렌더링하는 반면, 후자는 그것을 거짓으로 만들 것입니다. 나는 두 시나리오를 모두 테스트했으며 설명 된대로 두 가지 작업을 모두 테스트했습니다.

테스트를 두 번 확인하여 확인하십시오. 또한 규칙을 스스로 정의하는 순서가 아니라 우선 순위를 정의하는 헤더 부분의 정의는 왼쪽, %오른쪽 등의 순서입니다. 여전히 작동하지 않는다면 코드의 다른 영역 일 수도 있고,이를 엉망으로 만들거나 Bison 버전이 다를 수 있습니다 (이 시점에서 어둠 속에서 촬영하는 것입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top