프로그래밍언어론 2023-03-28 수업정리

Flow

review


프로그래밍언어론 3.28 수업정리에서 이어진다.

Syntax & Grammar


Syntax

int main() {
	return printf("Hello?\n") ? 0 : 1;
}

Syntax 표기법

CFG

Grammar Example


Derivation(유도)

Parse Tree

Ambiguity(모호성)


Removing the Ambiguity

  1. 결합방향을 명시한다.
    • <term> 이라는 nonterminal을 추가하여 연산자가 항상 <term>의 특정 위치에서 생성되도록 한다.

    • 아래는 연산자가 항상 <term>에 좌결합하도록 grammar를 수정한 것이다.

      <expr> -> <expr>+<term>

          | <expr>*<term>
      
          | <term>
      

      <term> -> (<expr>)

          | <num>
      

      <num> -> 1 | 2 | 3 | 4 | 5

    • 아래는 문법을 수정한 후의 Statement : 2+3*5에 대한 parse tree 중 하나이다. parse tree 02

    • 여전히 파스 트리는 여러 개가 나올 수 있으므로 ambiguous 하다.

  2. 생성 규칙 수정을 통해 선행 연산을 설정한다.
    • <fact>라는 nonterminal 기호를 추가하여 선행 연산을 설정한다.

    • +연산은 <expr>에 의해서만 생성 가능하다.

    • *연산은 <term>에 의해서만 생성 가능하다.

    • 아래는 수정한 grammar이다.

      <expr> -> <expr>+<term>

          | <term>
      

      <expr> -> <term>*<fact>

          | <fact>
      

      <fact> -> (<expr>)

          | <num>
      

      <num> -> 1 | 2 | 3 | 4 | 5

    • 아래는 문법을 수정한 후의 Statement : 2+3*5에 대한 parse tree이다. parse tree 3

    • 이제는 단 하나의 parse tree만 생성되므로 본 문법은 unambiguous grammar라고 말할 수 있다.

    • 참고로 이러한 방법을 통해 ambiguity를 제거하는 것을 precedence cascading이라고 한다.