저는 C (더 간단한 문법) 용 컴파일러를 작성하려고합니다.좌측 연관성 대 왼쪽 재귀
내가 잠시 머물러있는 것이 있습니다. 필자가 정확하게 말하면, 모든 이진 연산은 연관성을 유지합니다. 그래서 우리가 "x + y + z"를 가지면 x + y가 먼저 발생하고 그 다음에 z가 더해진다.
그러나 왼쪽 결합을 강제하지 않으면 무한 왼쪽 재귀가 발생합니까?
지금까지 확인한 모든 솔루션은 연관성이 왼쪽이거나 재귀가 남아 있지 않지만 은 모두이 아닙니다. 두 가지 속성을 모두 갖춘 문법을 사용할 수 있습니까? 심지어 가능할까요?
예 :
왼쪽 연관 :
Expr = Term | Expr + Term
Term = Element | Term ∗ Element
Element = x|y|z|(Expr)
왼쪽 재귀는 탈락 :
Expr = Term ExprTail
ExprTail = epsilon | + Term ExprTail
Term = Element TermTail
TermTail = epsilon | * Element TermTail
Element = x|y|z|(Expr)
어떤 아이디어?
왼쪽 연관성을 잃지 않고 왼쪽 재진입을 제거 할 수 있으며 LL 파서의 표준 절차입니다. 지수 연산자가있는 경우 이진 및 오른쪽 연관 연산자입니다. – EJP
C에서 할당 연산자는 오른쪽 연관이지만 그게 전부입니다. – sepp2k
@EJP 생성 된 구문 분석 트리가 트리에서 후 처리 작업을 수행하지 않고도 왼쪽 연관 방식이 될 수 있도록 왼쪽 재귀를 사용하지 않고 문법을 다시 작성하는 방법이 있습니까? 그렇다면 : 어떻게? – sepp2k