본문 바로가기

전체 글74

[프로그래밍언어론] 12. 블록(Block), 환경(Environment) 블록(Block)과 환경(Environment)이란? 블록 환경을 이해하기 위해서는 먼저 { ... }에 대해 생각해보자. 블록은 시작과 끝 기호로 식별되는 프로그램의 텍스트 영역이다. 블록에는 해당 지역에 대한 로컬 선언이 포함된다. 그러한 선언은 해당 지역 외부에서는 유효하지 않다. 블록은 다양한 방식으로 표현될 수 있다. 일반적으로 블록에 들어가고 나갈 때마다 환경이 변경된다. 블록은 중첩될 수 있다. 블록의 중복은 절대 허용되지 않는다. 마지막으로 열린 블록이 닫힐 때까지 이전 블록을 닫을 수 없다. 언어별 블록 표현 방식 Java if (a > 0 && b > 0) { q = a / b; } Python if a > 0 and b > 0: q = a /b Scheme (define var "PL.. 2023. 10. 10.
[프로그래밍언어론] 11. 이름(Name), 바인딩(Binding) 이름(Name)이란? 이름(Name) 이름은 단지 다른 객체를 대표(represent)하는(또는 의미(denote)하는) 일련의 문자일 뿐이다. 대부분의 프로그래밍 언어에서 이름은 식별자 형식을 갖는다. 예) 영숫자 토큰(v1, v2, func 등) 또는 기타 기호(_, $). 이름(Names) ≠ 개체(object) 이름과 그 이름으로 표시되는 대상은 동일한 것이 아니다. 하나의 이름은 여러 가지 다른 개체를 나타낼 수 있다. 또한 하나의 개체가 여러 가지 다른 이름을 가질 수 있다. 표시 가능한 객체(Denotable Objects) 표시 가능한 개체는 이름을 지정할 수 있는 개체이다. 사용자가 이름을 부여한 객체: 변수(variables), 매개변수(parameters), 함수(functions),.. 2023. 10. 10.
[프로그래밍언어론] 10. 추상 구문 트리(AST)를 EBNF로 변환 구문을 파이썬으로 추상 구문 트리(Abstract Syntax Tree; AST)로 분석하고 EBNF로 구현해본다. 'a = 3 + b' 구문을 분석해보자. 파이썬에서는 ast 모듈을 사용하여 코드를 구문 분석할 수 있다. ast 모듈의 사용법은 다음과 같다. import ast t = ast.parse('a = 3 + b') s = ast.dump(t, annotate_fields=False, indent=4) print(s) 코드 결과 Module([ Assign([ Name('a', Store())], BinOp( Constant(3), Add(), Name('b', Load()) ) ) ],[]) 결과 각 노드에 대해 노드 유형(Module, Assign, Name)으로 시작하고 해당 하위 노드를.. 2023. 10. 10.
[프로그래밍언어론] 9. BNF를 EBNF로 변환 변환 방법 BNF EBNF ::= A | AB ::= A [B] ::= '-' | ::= ['-'] ::= {X} A | A ::= A {A} ::= {X} A | ε ::= {A} ::= '+' | '-' ::= ('+' | '-') ::= '+' | '-' | ::= [('+' | '-')] EBNF로 변환할 때 주의점 대부분의 |는 제거된다. 중복되는 요소가 하는 일이 오직 조건을 구체화하는 것이라면, 그것들은 제거된다. 대부분의 재귀적 요소는 제거되고 { } 루프로 대체된다. null을 뜻하는 입실론(ε)이 없어진다. 변환 예시 BNF 표현 ::= int ; ::= | , EBNF 표현 ::= int { , } ; 참고 https://en.wikipedia.org/wiki/Syntax_diagra.. 2023. 9. 19.
[프로그래밍언어론] 8. BNF, EBNF 우리가 어떻게 프로그램언어(PL)에 대한 옳고 그름을 판단할 수 있을까? 또한 코드가 올바르게 작성되었는지 판단할 수 있는 기준은 뭘까? 우리는 주어진 코드에 구문 오류가 있는지 확인하면 된다. 형식 언어(Formal Language) 프로그래밍 언어의 일반적인 특성을 추상화 일련의 기호, 일부 형성 규칙(기호를 결합)으로 구성 언어 문법 E → E + E | E * E | N, N → 0N | 1N | λ 배커스-나우르 표기법(BNF) 원래는 John Backus가 개발한 Backus Normal Form Peter Naur가 확장하여 사용한 후 Donald Knuth의 제안으로 Backus-Naur Form(BNF)으로 이름 변경 문맥 자유 문법(context-free grammars)을 위한 표기법.. 2023. 9. 19.