최근 '정규 표현식 완전 해부와 실습'이라는 책으로
정규 표현식에 대해서 공부하고 있습니다.
Perl을 예제 언어로 하여 정규 표현식을 공부하고 있었는데,
역자 주에 재미있는 글을 발견했습니다.
=~는 "매치된다"는 뜻으로 생각하면 된다.
if ($reply =~ m/^[0-9]+$/)
따라서 위의 코드는 "$reply 변수에 들어있는 텍스트가
「^[0-9]+$」라는 정규 표현식에 매치된다면..."이라고 해석할 수 있다.
역자 주 : 영어로 하면 코드에 있는 if, $reply, =~ 연산자, 「^[0-9]+$」정규식이
모두 순서대로 등장하는 문장
(if the text contained in the variable $reply
matches the regex 「^[0-9]+$」 then....)이 되지만
한글로 옮기면 아쉽게도 그렇게 되지 않는다.
- 정규 표현식 완전 해부와 실습 Page 72
즉, 원서에는 코드와 같은 순서로 설명이 적혀있지만,
이를 한국어로 옮기니 순서가 맞지 않다는 뜻입니다.
한국어와 영어가 다른 것이 여러 개 있지만,
그 중 어순도 다릅니다.
한국어는 '주어-목적어-서술어',
영어는 '주어-서술어-목적어'입니다.
따라서 위의 영어 문장을 한국어로 옮길 때
어순이 달라지기에
코드와의 어순이 달라집니다.
한국어로 코드의 순서와 맞게 억지로 맞춘다면
"$reply 변수에 들어있는 텍스트가 매치된다면...
「^[0-9]+$」라는 정규 표현식에"
이라 해야 할 듯싶습니다.
여기까지 생각하니 문득 무엇인가가 떠올랐습니다.
예전에 혼자 자료구조론을 공부하고자
'C로 쓴 자료구조론'이라는 책으로 공부했습니다.
결국 50%도 이해하지 못하였기에
후에 수업을 들을 때 같이 공부하려고 두었습니다.
후위표기식은 그 때 자료구조 중 스택과 함께 배운 내용입니다.
'3 + 4'와 같은 수식을 쓸 때
우리는 중위표기식(infix notation)을 씁니다.
즉, 피연산자(operands) 사이에
연산자(operators)가 위치하는 표기법입니다.
위의 식에서는 피연산자는 '3, 4'이고,
연산자는 '+'입니다.
하지만 저 표기식은 컴파일러(compiler)에게는
해석하기 힘든 표기식입니다.
컴파일러에 대해 아는 것이 거의 없기에
그 이유를 정확히 모릅니다.
하지만 컴파일러가 일반적으로 사용한다는 후위표기식의 장점이
연산자의 우선순위와 괄호가 필요 없다고 합니다.
(연산자의 우선순위의 예로 PS에 적었습니다.)
따라서 중위표기식으로 적혀진 수식을 해석하면
우선순위를 따로 생각해야하니 컴파일러를 만드는 사람이 골이 아플 겁니다.
하지만 수식이 후위표기식으로 적혀지면
순서대로 데이터(정확하게는 토큰)를 읽어서 계산을 할 수 있으니
컴파일러를 만드는데 좀 더 편하지 않을까 생각합니다.
(후위표기식의 계산방법을 PS에 적었습니다.)
이런 후위표기식을 해당 코드에 적용하면 어떻게 될까 생각해보았습니다.
'if ($reply m/^[0-9]+$/ =~)'
위와 같이 되겠네요.
이제 한국어로 설명한 글을 조금 수정해서 가져오겠습니다.
"만약 $reply 변수에 들어있는 텍스트가
「^[0-9]+$」라는 정규 표현식에 매치된다면..."
그럼 이제 순서에 맞나요??^^
여기까지 생각해보니
수학이 왜 어려운지 알겠습니다.
'3 + 4'와 같은 식을 우리는
'삼 더하기 사'라고 읽습니다.
하지만 이를 우리말 문장으로 옮기면
'3과 4를 더한다.'가 됩니다.
이렇게 생각의 순서가 바뀌니
수학은 우리에게 친숙한 것이 아닌
영어와 같이 다른 세상 언어로 들리는 것 아닐까요?^^;;;;
이 생각 덕분에 예전에 대충 배웠던
후위표기식에 대해서 알 수 있었습니다.
후에 복학하면 자료구조와 컴파일러에 대해서 수업이 있는 것으로 알고 있습니다.
그 때 수업에서 어떤 내용을 배울지 상당히 기대가 되네요.^^
참조
정규 표현식 완전 해부와 실습
C로 쓴 자료구조론
PS
연산자의 우선순위 예로 +, -보다 *, /를 먼저 해야 함이 있습니다.
그러고 보니 여기에 관련된 글이 이오공감에 올랐습니다.
제목에 있는 수식을 후위표기식으로 표현하면
'111 1 2 * +'이군요.
해석은 이렇게 되겠네요.
처음 111과 1이 만났으나 그 다음에 연산자가 아닌 2가 읽혀집니다.
그럼 '111, 1, 2'의 순서로 기억했다가 다음을 읽습니다.
다음으로 나오는 것은 연산자 *입니다.
따라서 제일 오른쪽에 있는 피연산자 두 개
즉, 1과 2를 이번에 만난 연산자 *와 합쳐 계산합니다.
그럼 1 * 2 = 2가 되는군요.
이 계산결과를 다시 기억합니다.
그럼 '111, 2'가 되네요.
다시 다음을 읽으니 연산자 +입니다.
따라서 남아있는 111과 2를 연산자 +와 합쳐 계산합니다.
그럼 111 + 2 = 113이 되는군요.
그 뒤에는 아무것도 없기에 해당 수식의 답은 113이 됩니다.
헷갈리면 굳이 엑셀을 동원할 필요 없이
후위표기식으로 바꾸면 되는군요.^^;;
- 어느 빈집털이가 더 많은 벌을 받았을까? (11)2007/10/15
- 국어를 영어로 배운다. (8)2007/10/09
- 남북정상회담 공동선언문 주요내용을 보면서... (12)2007/10/04
- 표기식으로 살펴본 수학 혹은 코드 읽기가 어려운... (6)2007/10/03
- 천재를 만나면 보내고 노력하고 기뻐하자. (6)2007/09/25
- '~님', '~씨' (12)2007/09/22
- 펌하는 사람이 하는 착각 (8)2007/09/16
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요
포스가 생각나네요. 포스가 함께하길 하는 그 포스 말고요 forth라는 랭귀지요. 스택기반이고 우리말로 자연스럽게 읽기는 특징이 있죠.
오른쪾에서 왼쪽으로 쓰는 글(아랍쪽)도 있고 위에서 아래로 쓰는 글(한자권)도 있고 심지어 왼쪽에서 오른쪽(로마권)으로 쓰는 글도 있으니 규칙이란 것을 만든다는 것은 포스가 막강해야 되겠죠? 효율을 타진다면 도퇴될 것인데 한문 같은 경우는 전산이나 타자기 같은 기계구조가 반영안한 것이지 비효율은 아닐 것 같단 생각이 드는군요.
/oseb/
<a href="http://en.wikipedia.org/wiki/Forth_">http://en.wikipedia.org/wiki/Forth_</a>(programming_language)
위의 링크에 있는 언어 말인가요??
처음 보는 언어네요.ㄷㄷ
위키를 살펴보니 이런 말이 있네요.
Forth relies heavily on explicit use of a data stack and reverse Polish notation (RPN or postfix notation).
즉, 후위표기식을 쓰는군요.^^
책에는 대체로 코드에 중위표기식을 쓴다고 적혀있는데,
그렇지 않은 예가 Forth였군요.
정보 고맙습니다.^^
확실히 현재 컴퓨터 자체가 영어에 맞춰져있으니
다른 언어를 맞춘다는 건 새롭게 만들어야한다는 의미도 있으니 상당히 어렵지만,
비효율까지는 아니겠네요.^^
저는 빨리 한글로 코딩이 가능한 날이 왔으면 좋겠습니다.
만약(x, y 동일)
{
x 화면출력
}
언제면 올까요? 아마 전혀 오지 않을 테죠. ㅜㅜ
/codebook/
저도 오기를 바랍니다만,
훈민정음의 뜻(?)을 받들어
쉬운 언어를 만들어야 할 듯....OTL.....
1. kldp에서 일본어 자연어 프로그래밍 언어에 대한 소개를 (아마 몇 년 전에) 본 적이 있습니다. 기억하는 분이 있을텐데...
2. 111 1 2 * + : "111"에 "1"과 "2"의 "곱"을 "더함"
3. "if ()" 도 "() 라면" 으로 바뀌어야 :)
ㄱ 과 ㄴ이 같다.면.
ㄱ을 출력한다.
/daewonyoon/
반갑습니다..는 아니네요.
예전에 20촌 관련글이 틀림을 지적해주셨으니까요.^^
1. 일본어 자연어 프로그래밍이 있군요.
일본어와 우리나라어는 어순이 비슷하다고 하니
우리나라 언어로 만든 프로그래밍 언어도 가능할 듯...
2. 그런 식으로 해석해야 하는군요.
3. 아.. 그렇습니다.^^