1
문법 자유 문법에서 다음과 같은 논리 연산 (및, 아닌) 중 우선 순위가 높은 논리 문법을 알 수있는 방법은 무엇입니까? 이런 종류의 문제에 대한 일반적인 접근법이 있습니까?문맥 자유 문법에서 연산자의 우선 순위를 알려주는 방법
X → X 또는 Y | Y
Y → Y 및 Z | Z
Z → not Z | (X) | 사실 | 거짓
문법 자유 문법에서 다음과 같은 논리 연산 (및, 아닌) 중 우선 순위가 높은 논리 문법을 알 수있는 방법은 무엇입니까? 이런 종류의 문제에 대한 일반적인 접근법이 있습니까?문맥 자유 문법에서 연산자의 우선 순위를 알려주는 방법
X → X 또는 Y | Y
Y → Y 및 Z | Z
Z → not Z | (X) | 사실 | 거짓
여기 예제 접근 방식 :
expr -> addExpr;
addExpr -> multExpr (('+'|'-') multExpr)*;
multExpr -> terminalExpr (('*'|'/') terminalExpr)*;
terminalExpr -> integer | variable | '(' expr ')';
그러나 연관성이 모호합니다. 다음은 BNF에서 좀 더 명시 적 방법이있다 :
expr -> addExpr;
addExpr -> addExpr '+' multExpr | addExpr '-' multExpr | multExpr;
multExpr -> multExpr '*' terminalExpr | multExpr '/' terminalExpr | terminalExpr;
terminalExpr -> integer | variable | '(' expr ')';
이 문법은 +
및 -
로 더 우선 순위를 가진 것으로 운영자에게 *
및 /
을 정의합니다. 구문 분석 트리에서 더 높은 우선 순위의 연산을 선언하므로 파서가 먼저 시도합니다.
좋은 예. 감사. 그래서 파싱 트리에서 더 높은 우선 순위를 가진 연산이 더 낮아야한다는 것을 의미합니다. 아마 당신의 대답과 이드에 그것을 더할 수 있습니다. –
이 문법은 1 + 2 + 3을 허용하지 않습니다 – rici
@rici huh 내가 뭘 생각하는지 모르겠군요 : - 이걸 알아 줘서 고마워, 대답을 고쳤어. –