플렉스와 들소 연관성 난이도
-
20-08-2019 - |
문제
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 버전이 다를 수 있습니다 (이 시점에서 어둠 속에서 촬영하는 것입니다).