α, β -> terminal or non-terminal
A, B -> non-terminal
a, b, c -> terminal
이라고 할 때
- Type-0 : unrestricted grammars
- α -> β로 변경될 수 있는 문법. Type-0은 프로그래밍 언어적으로 별로 중요하지 않다고 함.
- Type-1 : context sensitive grammars
- αAβ -> αBβ로 변경될 수 있는 문법. 앞 뒤에 특정 컨텍스트가 있을 경우에 변경됨. 이 경우에는 α, β가 특정 컨텍스트에 해당함.
- Type-2 : context free grammars
- A -> αBβ로 변경될 수 있는 문법. 컨텍스트에 영향 없이 변경. α가 A를 가져서 다시 A로 돌아갈 수 있는 경우도 있음.
- Type-3 : regular grammars
- A -> a | aB로 변경될 수 있는 문법. 변경됐을 때 다시 A로 돌아갈 수 있는 방법이 없음.
- Type들은 포함관계가 있으며 Type-0이 Type-1을 포함하고 1이 2를 포함하는 식임.
- Type-1와 Type-2의 차이는 주변 컨텍스트에 관계없이 produce가 가능한가의 여부.
- 1 + 2의 결과와 "1" + 2의 결과가 다르게 해석되는 것이 type-1의 요소에 해당하는 것. 같은 1이지만 1의 주변에 다른 컨텍스트("")가 있는 것에 따라서 1을 숫자/문자로 다르게 해석하기 때문임.
- syntax analysis과정이 Type-2에 해당하는 요소까지만 다룬 것이고 Type-1(context sensitive)의 요소들을 다루기 위해서 semantic analysis를 수행하는 것임.
- 컴파일러에서는 크게 static한 semantic과 dynamic한 semantic이 있음. 컴파일러가 수행하는 semantic 분석은 static한 분석이고 devide by zero, out of index같은건 체크를 runtime으로 미룬 것으로 dynamic한 것임.
class Shape
class Circle
class Square
area(Shape)
Shape s
area(s)
- 위의 케이스에서 s가 Shape타입인지 확인하는게 static semantic analysis이고 실제 런타임에 들어온건 Circle이나 Square일 경우 이를 처리하는건 dynamic semantic analysis에 해당함.
- 언어마다 static/dynamic한 처리에는 차이가 있을 수 있음.
- Java의 경우 실행시 null값 확인을 하지만 C#같은 경우는 nullable이 아니면 null을 못넣음. 이 경우 null의 처리에 대해서 java는 dynamic한데 C#은 static하다는 것임.