2

"Engineering a Compiler, 2nd Edition"을 학습 중입니다. 그리고 LR (1) 문법이 무엇인지는 알고 있지만이 책에서는 연산자 우선 순위 문법을 찾을 수 없습니다. 나는 아직도 그것을 찾을 수 없습니다 library.But에서 - LR (1) 문법과 연산자 우선 순위 문법의 차이점은 무엇입니까?

은 그 때 나는 "원칙, 기법 및 도구 컴파일러를"빌려.

그래서 LR (1) 문법과 연산자 우선 순위 문법의 차이점을 알고 싶습니다.

그리고 LR (1) 문법이 연산자 우선 순위 문법을 대체 할 수 있다면. 감사합니다!

+0

여기에서 주제를 벗어납니다. [Wikipedia] (https://en.wikipedia.org/wiki/Operator-precedence_grammar)를 사용해보십시오. – EJP

+0

이 질문은 컴퓨터 과학에 속해 있기 때문에 주제가 아닌 것처럼 보입니다. – EJP

답변

2

연산자 문법은 오른쪽에 연속적인 비 - 터미널이없는 문맥 - 자유 문법입니다. (직관적으로 모든 생산에는 수식 문법과 같이 연산자가 있습니다.)

연산자 우선 문법은 구문 분석 자동화 도구가 터미널은 구문 분석 스택의 맨 위에 가장 가까운 터미널과 미리보기 헤드 토큰을 사용합니다. 그러한 우선 순위 관계는 완전하거나, 전 이적이거나, 비대칭 적이 지 않습니다.

저는 모든 연산자 우선 순위 문법은 LR (1)이지만, 그 반대는 확실하지 않습니다. 예를 들어, LR (1) 문법은 연속적인 비 - 단말기에 대한 제한을 갖지 않으며, LR (1) 문법의 시프트/감소 결정이 파스 (parse) 스택의 최상위 터미널과 상관되지 않을 가능성이 높습니다 및 미리보기 토큰. 그럼에도 불구하고 일부 유용한 언어는 연산자 우선 순위 문법으로 표현 될 수 있습니다.

LR 파싱과 마찬가지로 연산자 우선 구문 분석은 상향식 기술입니다. 그것은 아마도 LALR 알고리즘보다 이해하기 쉽지만 다른 확실한 이점은 없습니다. (일부 구현에서는 잘못된 문장을 인식 할 수 있다는 점에서) 신뢰성이 떨어집니다. 확인하기가 더 어렵습니다. 그러나 LALR 알고리즘이 발견되기 전에 LR (1) 자동화 (및 사용 가능한 제한된 컴퓨팅 리소스)의 크기가 연산자 우선 구문 분석을 합리적인 방법으로 생각했습니다.

요즘 사용 가능한 많은 파서 생성기 중 하나를 사용하는 것이 좋습니다.