source program에서 어휘를 분석하여 token 단위로 분석을 해 구문분석기에 전달해주는 역할은 한다.
ex if ( a > 10 )
여기서 if, (, a, >, 10, )이 문자들은 각각 의미를 가지는 token 단위로 짜를것이다.
이 각각에 token number를 부여해서 컴퓨터가 다루기 쉽게 정수로 바꿀것이다.
if = 32
( = 7
a = 4
\> = 25
10 = 5
) = 8 로 치환했다고 생각해보자.
특수문자나 변수, identifier은 그렇다쳐도 숫자부분도 정수로 하나하나 바꾸게 되면 무한정 number가 늘어날수도 있고 이를 다 mapping 할수는 없는 노릇이다.
그래서 token value도 추가하여 token을 구별하자.
token = (token number, token value)
if = (32,0)
( = (7,0)
a = (4, 'a')
\> = (25, 0)
10 = (4, 10)
이런 식으로 mapping 시킬수있다.
lexical Analyzer(Scanner)과 syntax Analyzer(Parser)은 같이 실행되는데 구문분석기에서 token값이 필요할 때마다 Scanner를 호출하는 식으로 작동한다고 생각하면 된다.
ㅣ : a | b | c | ... | z | A | B | C | ... | Z
d : 0 | 1 | 2 | 3 | ... | 9
special : + | - | ... | )
식별자는 변수이름 같은 부분에서 활용된다.
변수 이름은 처음에 문자나 _가 나오고 그 이후에 문자, _, 숫자가 나올수있으므로
S = (l, _)(l + d + _)* 정규표현으로 나타낼수있다.
숫자 S = nd* + 0 + 0o+ + 0(x + X)h+
(n은 0을 제외한 digit다. 10진수, 8진수, 16진수를 나타낼수있다.)
실수 S = d+.d+ + d+.d+e( + '+' + '-')d+
(e로 표현하거나 안하거나)
문자열 S = "(a + \c)*"
주석 S = /*(a+***b)***/
위와 같이 표현식으로 identifier을 표현할수있다.
A Lexical Analyzer Generator
lex source .l 을 input으로 받아 output으로 lex.yy.c을 만들어주는 어휘분석기를 만들어준다.
format
{정의}
%%
{룰}
%%
{user subroutines}
ex
[a-z]+ 으로 쓰면 a~z의 문자가 최소 1개 적힌 것이다.
[0-9]* 0~9가 최소 0개 적힌 것이다.