모호한 문법과 연산자 우선순위

10 - 4 / 2 는 3일까, 8일까?

우선순위가 없는 문법

어디서 가를지 정해 주지 않습니다

이 문법에서 식은 '식, 연산자, 식'이거나 const입니다. 10 - 4 / 2 에 첫 규칙을 쓸 때, 가운데 연산자로 / 를 골라도 되고 - 를 골라도 됩니다. 문법은 어느 쪽인지 정해 주지 않습니다.

이 강의가 따르는 교재의 문법입니다. op는 operator(연산자), / 는 나누기입니다. const 자리에 예시 숫자 10, 4, 2를 넣었습니다.

나무 1

빼기가 아래에 묶인 나무

/ 에서 가르면 10 - 4 가 나뭇가지 하나 아래에 묶입니다. 4편에서 본 대로 나뭇가지 하나 아래는 한 덩어리이므로 아래쪽 덩어리부터 계산합니다. 값은 3입니다.

예시 값입니다. 나무의 잎에는 const 대신 그 자리의 숫자를 적었습니다.

나무 2

나누기가 아래에 묶인 나무

같은 문장을 - 에서 가르면 이번에는 4 / 2 가 나뭇가지 하나 아래에 묶입니다. 문법도 문장도 그대로인데 값은 8입니다.

예시 값입니다.

모호한 문법

문장은 하나, 나무는 둘

한 문장에 서로 다른 파스 트리가 둘 이상 그려지는 문법을 모호한 문법(ambiguous grammar)이라고 합니다. 컴파일러는 파스 트리를 따라 뜻을 정하므로, 나무가 둘이면 뜻을 하나로 정할 수 없습니다.

고치는 법

연산자마다 단계를 나눕니다

빼기는 <expr> 규칙에서만, 나누기는 <term> 규칙에서만 만들어지게 했습니다. <term>은 <expr>에서 풀려 나오므로, 나누기는 나무에서 늘 빼기보다 아래에 놓입니다.

교재의 문법입니다. 식(expression)과 항(term)을 서로 다른 단계로 나눴습니다.

나무는 하나

아래에 놓인 연산이 먼저입니다

고친 문법으로는 10 - 4 / 2 의 나무가 이것 하나뿐입니다. 어느 연산자를 먼저 계산할지가 연산자 우선순위(precedence)이고, 문법에서는 단계로 나타냅니다. 이렇게 문장마다 나무가 하나인 문법이 비모호한 문법(unambiguous grammar)입니다.

숫자는 예시입니다.

다음 편

같은 연산자가 두 번 나오면 어느 쪽부터 묶을까요?

6편같은 연산자가 이어지면? 2강 목록