3. 생성되는 Lexical Anaylzer

문법에 맞게 작성된 specification으로 JLex를 실행시키면, 해당 기능을 수행하는 변환된 lexical analyzer 자바 소스 코드를 얻을 수 있다.

생성된 lexical analyzer는 Yylex 클래스에 구현된다. 여기엔 토큰화할 입력 스트림을 인자를 받는 두개의 생성자가 존재한다. 입력 스트림으로는 java.io.InputStream이나 java.io.Reader( 예. StringReader )를 사용할 수 있다. JDK1.0의 java.io.InputStream은 유니코드를 제대로 읽지 못하기 때문에, 유니코드를 사용하려는 경우 java.io.Reader를 사용해야 함에 유의하자.

lexer는 Yylex.yylex()를 사용하여 접근 가능하다. 이 함수는 입력 스트림에 존재하는 바로 다음 토큰을 리턴한다. 리턴형은 Yytoken이며 다음과 같이 함수 형태가 정의되어 있다.
class Yylex { ...
public Yytoken yylex() {
... }
사용자는 Yytoken 형을 정의해야만 하며, 이것은 JLex specification의 첫 번째 section에서 쉽게 할 수 있는 작업이다. 예를 들어, Yylex.yylex()가 integer의 wrapper를 리턴하는 경우, 첫 번째 %% 앞에 다음과 같은 코드를 작성할 수 있다.
class Yytoken { int field; Yytoken(int f) { field=f; } }
이렇게 한 뒤, lexical action에서 다음과 같이 wrapped integer를 리턴할 수 있다.
{ ...
return new Yytoken(0);
... }
마찬가지로, 사용자 코드 section에서 각 토큰형에 해당하는 상수를 다음과 같이 정의할 수 있다.
class TokenCodes { ...
public static final STRING = 0;
public static final INTEGER = 1;
... }
이렇게 한 뒤, 이들 중 하나를 다음과 같이 리턴할 수 있다.
{ ...
return new Yytoken(STRING);
... }
이상은 아주 간단한 예들로, 실제로는 훨씬 많은 정보를 담을 수 있는 토큰 클래스를 만들어야 하는 경우가 많다.

Yylex.yylex()에서 리턴되는 토큰형을 보다 다양하게 하기 위해서 여러가지 객체 지향적인 기법들을 사용하는 것이 좋다. 예를 들어, 상속을 사용하면 하나 이상의 토큰형을 사용할 수 있게 된다. 문자열과 정수들에 대해 토큰형을 구별하고 싶은 경우 다음과 같이 하면 된다.
class Yytoken { ... }
class IntegerToken extends Yytoken { ... }
class String extends Yytoken { ... }
이렇게 한 뒤, IntegerToken과 StringToken 형을 구별하여 사용할 수 있다.

lexical analyzer 클래스명, 토큰화 함수명과 리턴형은 JLex 지시문을 통하여 변경될 수 있다. 2.2.9 section에 보다 자세한 설명이 있다.