| HOME / 정보공유 / AIX 명령어 모음

lex
lex lex 명령 목적 입력 스트림의 단순한 어휘 분석 패턴을 맞추는 C 또는 C++ 언어 프로그램을 작성합니다. 구문
lex [ -C ] [ -t ] [ -v| -n ] [ File... ]
설명
lex 명령은 File 또는 표준 입력을 읽고, C 언어 프로그램을 작성하여 이를 lex.yy.c라는 파일에 기록합니다. lex.yy.c 파일은 컴파일 가능한 C 언어 프로그램입니다. C++ 컴파일러 또한 lex 명령의 출력을 컴파일할 수 있습니다. -C 플래그는 출력 파일을 C++ 컴파일러용 lex.yy.C로 이름을 바꿉니다.
lex 명령으로 작성한 C++ 프로그램은 STDIO 또는 IOSTREAMS를 사용할 수 있습니다. C++ 컴파일 동안 cpp define_CPP_IOSTREAMS가 창이면, 프로그램은 모든 I/O에 대해 IOSTREAMS를 사용합니다. 그렇지 않으면, STDIO를 사용합니다.
lex 명령은 File에 포함된 규칙과 조치를 사용하여 cc 명령으로 컴파일될 수 있는 프로그램 lex.yy.c를 작성합니다. 그런 다음, 컴파일된 lex.yy.c는 입력을 수신하고, File 내의 규칙이 정의한 논리 부분으로 입력을 나누고, File 내의 조치에 포함된 프로그램 프래그먼트를 수행할 수 있습니다.
생성된 프로그램은 yylex라 지칭되는 C 언어 함수입니다. lex 명령은 yylex 함수를 이름이 lex.yy.c인 파일에 보관합니다. yylex 함수만을 사용하여 간단한 한 단어 입력을 인식할 수 있거나, 다른 C 언어 프로그램과 함께 사용하여 더 어려운 입력 분석 기능을 수행할 수 있습니다. 예를 들어, lex 명령을 사용하여 yacc 명령으로 작성된 파서 프로그램에 송신하기 전에 입력 스트림을 단순화하는 프로그램을 작성할 수 있습니다.
yylex 함수는 유한 상태 기계라고 하는 프로그램 구조를 사용하여 입력 스트림을 분석합니다. 이 구조는 프로그램이 한번에 한 상태(또는 조건)에만 있게 합니다. 허용되는 유한 개수의 상태가 있습니다. File의 규칙은 프로그램이 한 상태에서 다른 상태로 이동되는 방법을 결정합니다.
File을 지정하지 않으면, lex 명령은 표준 입력을 읽습니다. 여러 개의 파일을 하나의 파일로 취급합니다.
주: lex 명령이 중간 파일 및 출력 파일에 고정된 이름을 사용하므로, 주어진 디렉토리에 lex가 작성한 하나의 파일만을 있을 수 있습니다.
lex 스펙 파일
입력 파일에는 세 개의 섹션 즉, definition, rules, user subroutines가 있을 수 있습니다. 각 섹션은 분리문자 %%(이중 퍼센트 기호)만을 포함하는 행으로 다른 섹션과 구분되어야 합니다. 형식은 다음과 같습니다.
definitions
%%
rules
%%
user subroutines
각각의 목적과 형식은 다음 섹션에서 설명됩니다.
정의
규칙의 변수를 사용하려면, 이 섹션에 변수를 정의해야 합니다. 변수는 왼쪽 열에 작성하고, 정의는 오른쪽 열에 작성합니다. 예를 들면, 숫자 자리로 D를 정의하려면, 다음과 같이 기록해야 합니다.
D [0-9]
변수 이름을 중괄호 {}로 규칙 섹션에서 정의된 변수를 사용할 수 있습니다.
{D}
공백으로 시작하거나 %{, %} 분리자로 둘러싼 정의 섹션의 행은 lex.yy.c 파일에 복사됩니다. 이 구조를 사용하여 lex 조치에 사용하거나 헤더 파일에 포함시킬 C 언어 변수를 선언할 수 있습니다.
%{
#include
int count;
%}
이러한 행은 규칙 섹션의 처음에, 첫번째 %% 분리자 바로 다음에 나타날 수도 있지만, 규칙 섹션 외의 다른 장소에서는 사용하지 않아야 합니다. 행이 File의 정의 섹션에 있는 경우, lex 명령은 이 행을 lex.yy.c 파일의 외부 선언 섹션에 복사합니다. 행이 규칙 섹션에 있는 경우, 최초 규칙에 앞서, lex 명령은 lex.yy.c에 있는 yylex 서브루틴의 국지 선언 섹션에 행을 복사합니다. 이러한 행은 최초 규칙 이후에는 나타나지 않아야 합니다.
lex 외부 유형 즉, yytext는 정의 섹션에 다음 중 하나를 지정하여 널 종료 문자 배열(디폴트) 또는 널 문자 종료 문자열 포인터로 설정될 수 있습니다.
%array (default)
%pointer
정의 섹션에서, 결과 유한 상태 기계에 대한 테이블 크기를 설정할 수 있습니다. 디폴트 크기는 작은 프로그램에 충분할 만큼 큽니다. 더 복잡한 프로그램에 대해 더 큰 크기를 설정하고자 할 수도 있습니다.
%an 전이의 수는 n(디폴트 5000)입니다.
%en 해석 트리의 수는 n(디폴트 2000)입니다.
%hn 복수 바이트 문자 출력 슬롯의 수(디폴트 0)
%kn 압축된 문자 클래스의 수(디폴트 1000)
%mn 복수 바이트 "문자 클래스" 문자 출력 슬롯의 수(디폴트 0)
%nn 상태의 수는 n(디폴트 2500)입니다.
%on 출력 슬롯의 수(디폴트 5000, 최소 257)
%pn 위치의 수는 n(디폴트 5000)입니다.
%vp %h 및 %m에 의해 제어되는 해쉬 테이블에 빈 슬롯의 퍼센트(디폴트 20, 범위 0 <= P < 100)
%zn 복수 바이트 문자 클래스 출력 슬롯의 수(디폴트 0)
복수 바이트 문자가 확장 정규식 문자열에 나타나면, 가능하면 10,000에서 20,000까지의 범위 내에서 %o 인수로 출력 배열 크기를 재설정해야 합니다. 이 재설정은 단일 바이트 문자의 수에 비하여 훨씬 더 큰 문자의 수에 영향을 미칩니다.
복수 바이트 문자가 확장 정규식에 나타나면, %h와 %m 인수를 갖는 복수 바이트 해쉬 테이블 크기를 lex 파일에 포함된 복수 바이트 문자의 총 수보다 더 큰 크기로 설정해야 합니다.
복수 바이트 문자가 확장 정규식에 나타나지 않지만, '.'를 복수 바이트 문자에 대응시키고자 한다면 %z를 0보다 더 크게 설정해야 합니다. 이와 같은 방식으로 역문자 클래스(예: [^abc]) 복수 바이트 문자를 대응시키려면, %h와 %m을 모두 0보다 크게 설정해야 합니다.
복수 바이트 문자를 사용할 때 lex.yy.c 파일은 -qmbcs 컴파일러 옵션과 함께 컴파일되어야 합니다.
규칙
일단 항목을 정의하면, 규칙 섹션을 작성할 수 있습니다. 규칙 섹션에는 yylex 서브루틴이 대응시킬 문자열과 표현식이 포함되고, 대응되면 실행할 C 명령이 포함됩니다. 이 섹션은 필수이며, 분리자 정의 섹션의 유무와 관계 없이 %%(이중 퍼센트 부호)가 우선순위해야 합니다. lex 명령 정의 섹션의 유무와 관계없이, 이 분리문자 없이는 규칙을 인식하지 못합니다.
이 섹션에서, 왼쪽 열에는 확장 정규식 양식의 패턴이 있는데, 이것은 yylex 서브루틴의 입력 파일에서 인식될 것입니다. 오른쪽 열에는 패턴이 인식되면 실행될 C 프로그램 프래그먼트가 있는데, 이를 action이라 부릅니다.
어휘 분석기가 확장 정규식과의 일치를 발견하면, 확장 정규식과 관련된 조치를 실행합니다.
패턴은 확장 문자를 포함할 수 있습니다. 복수 바이트 로케일이 시스템에 설치되었다면, 패턴에 설치 코드 세트의 일부인 복수 바이트 문자를 포함할 수도 있습니다.
열은 탭 또는 공백에 의해 구분됩니다. 예를 들어, 키워드 KEY를 가지고 있는 파일을 탐색하기 위해 다음과 같이 입력할 수 있습니다.
(KEY) printf ("found KEY");
이 규칙을 File에 포함시키면, yylex 어휘 분석기는 패턴 Key를 대응시키고 printf 서브루틴을 수행합니다.
각 패턴은 대응 조치, 즉 패턴이 대조되면 실행할 C 명령을 가질 수 있습니다. 각 명령문은 ;(세미콜론)으로 끝나야 합니다. 한 조치에 둘 이상의 명령문을 사용하려면, 모든 명령문을 { }(중괄호)로 묶어야 합니다. 두 번째 분리자, %%는 사용자 서브루틴 섹션이 있을 경우 규칙 세션 뒤에 있어야 합니다. 패턴 대응에 대한 지정된 조치가 없으면, 어휘 분석기는 입력 패턴을 변경하지 않고 출력으로 복사합니다.
yylex 어휘 분석기가 입력 스트림 내의 문자열에 대응하면, 규칙 섹션 내의 명령을 실행하기 전에 대응된 문자열을 외부 문자 배열(또는 문자열에 대한 포인터) yytext에 복사합니다. 마찬가지로, 외부 int yyleng는 바이트 단위로 대응 문자열의 길이에 설정됩니다. 따라서, 다중 바이트 문자의 크기는 1보다 큽니다.
확장된 정규식을 형성하는 방법에 관한 정보는 "lex 명령에서 확장된 정규식" AIX 5L Version 5.1 General Programming Concepts: Writing and Debugging Programs에서 참조하십시오.
사용자 서브루틴
lex 라이브러리는 다음과 같은 서브루틴을 lex 스펙 파일의 규칙 섹션에서 사용할 수 있는 매크로로서 정의합니다.
input yyin에서 바이트를 읽습니다.
unput 읽은 후에 바이트를 대체합니다.
output 출력 바이트를 yyout에 씁니다.
winput yyin으로부터 여러 바이트 문자를 읽습니다.
wunput 읽은 후에 복수 바이트 문자를 대체합니다.
woutput 여러 바이트 출력 문자를 yyout에 씁니다.
yysetlocale 현재 로케일을 결정하기 위해 setlocale(LC_ALL, " "); 서브루틴을 호출합니다.
winput, wunput 및 woutput 매크로는 lex.yy.c 파일에서 코드화된 yywinput, yywunput 및 yywoutput 서브루틴을 사용하도록 정의됩니다. 호환성을 위해, 이 yy 서브루틴은 input, unput, output 서브루틴을 연달아 사용하여 완전한 다중 바이트 문자에서 필요한 수의 바이트를 읽고, 대체하며 쓰기합니다.
사용자 서브루틴 섹션에서 이들 루틴에 대한 사용자의 코드를 작성하여 이 매크로를 겹쳐쓸 수 있습니다. 그러나, 자신의 코드를 작성하는 경우에는 정의 섹션에서 다음과 같이 이들 매크로를 비정의해야 합니다.
%{
#undef input
#undef unput
#undef output#undef winput
#undef wunput
#undef woutput
#undef yysetlocale
%}
lex.yy.c에는 main 서브루틴이 없습니다. 왜냐하면, lex 라이브러리가 yylex 어휘 분석기를 호출하는 main 서브루틴뿐만 아니라, File 끝에서 yylex( )로 호출되는 yywrap 서브루틴을 포함하기 때문입니다. 따라서, main( ), yywrap( ) 또는 둘 다를 사용자 서브루틴 섹션에 포함시키지 않으면, lex.yy.c를 컴파일할 때, cclex.yy.c-ll를 입력해야 합니다. 여기서, ll는 lex 라이브러리를 호출합니다.
lex 명령에 의해 작성된 외부 이름은 yyin, yyout, yylex 및 yytext에서와 같이 yy 서문으로 시작합니다.
유한 상태 기계
유한 상태 기계에 대한 디폴트 골격은 /usr/ccs/lib/lex/ncform에서 정의됩니다. 사용자는 환경 변수 LEXER=PATH를 설정하여 개인적으로 구성설정된 유한 상태 기계를 사용할 수 있습니다. PATH 변수는 사용자가 정의하는 유한 상태 기계 경로와 파일 이름을 지정합니다. lex 명령은 이 변수에 대한 환경을 점검하고 설정되어 있으면 제공된 경로를 사용합니다.
표현식에 공백 기록
일반적으로 공백 또는 탭은 규칙과 규칙을 정의하는 표현식을 끝냅니다. 그러나, " "(인용 부호)로 공백 또는 탭을 묶어서 표현식에 포함 시킬 수 있습니다. 아직 [ ](대괄호)로 설정하지 않은 표현식의 모든 공백을 묶는 데 따옴표를 사용하십시오.
기타 특수 문자
lex 프로그램은 많은 C 언어 특수 문자를 인식합니다. 문자 순서는 다음과 같습니다.
열 의미
\a 경고
\b 백스페이스
\f 페이지 넘김 문자(FF)
\n 개행(실제 개행 문자를 표현식에 사용하지 마십시오.)
\r 리턴
\t 탭
\v 세로 탭
\\ 백슬래쉬
\digits digits에 의해 지정된 하나, 둘 또는 세 자리 8진수로 표시되는 코드가 있는 문자
\xdigits digits에 의해 지정된 16진수 순서로 표시되는 암호화된 문자.
\c 여기서 c는 위에 나열된 문자가 아니며, 문자 c가 변경되지 않음을 나타냅니다.
주: \0 또는 \x0을 lex 규칙에 사용하지 마십시오.
이들 특수 문자를 표현식에 사용할 때, 따옴표로 묶을 필요가 없습니다. 이 특수 문자를 제외한 모든 문자와 AIX 5L Version 5.1 General Programming Concepts: Writing and Debugging Programs의 "lex 명령에서의 확장 정규식"에 설명된 연산자 기호는 항상 텍스트 문자입니다.
대응 규칙
둘 이상의 표현식이 현재 입력에 대응할 수 있을 때 lex 명령이 가장 긴 대응을 최초로 선택합니다. 몇 개의 규칙이 같은 수의 문자에 대응하면, lex 명령은 처음에 발생하는 규칙을 선택합니다. 예를 들어, 다음 규칙이
integer keyword action...;
[a-z]+ identifier action...;
위의 순서로 주어지고, integers가 입력 단어이면, lex는 입력을 식별자로서 대응시키는데, 그 이유는 [a-z]+는 8문자를 대응시키지만 intergers는 7문자만을 대응시키기 때문입니다. 그러나, 입력이 정수라면 두 규칙은 모두 7문자를 대응시킵니다. lex는 키워드 규칙이 최초로 발생하기 때문에 키워드 규칙을 선택합니다. int와 같은 축약형 입력은 표현식 정수에 대응하지 않기 때문에 lex가 식별자 규칙을 선택합니다.
와일드카드 문자를 사용한 문자열 대응
lex는 가장 긴 대응을 최초로 선택하기 때문에 .*와 같은 표현식이 있는 규칙을 사용하지 마십시오. 예를 들어, 다음은
'.*'
작은따옴표 안의 문자열을 인식하는 좋은 방법이라고 생각할 수도 있습니다. 그러나, 어휘 분석기는 훨씬 앞쪽을 읽어서 멀리 있는 작은따옴표를 찾아 긴 대응을 완성하려 합니다. 이러한 규칙을 가진 어휘 분석기에 다음과 같이 입력하면,
'first' quoted string here, 'second' here
다음과 같이 대응됩니다.
'first' quoted string here, 'second'
더 작은 문자열 first와 second를 찾으려면, 다음 규칙을 사용하십시오.
'[^'\n]*'
이 규칙은 'first' 다음에서 정지됩니다.
이 유형의 오류는 그리 멀리 미치지 않습니다. 그 이유는 .(마침표) 연산자가 개행 문자에 대응하지 않기 때문입니다. 따라서, .*(마침표 별표) 같은 표현식은 현재 행에서 정지됩니다. 이것을 굳이 [.\n]+와 같은 표현식으로 무시하려고 하지 마십시오. 어휘 분석기가 전체 입력 파일을 읽으려고 시도하여 내부 버퍼 오버플로우가 발생합니다.
문자열 내에서 문자열 찾기
lex 프로그램은 입력 스트림을 분할하며 각 표현식에 가능한 모든 대응을 탐색하지는 않습니다. 각 문자는 한 번만 계산됩니다. 예를 들어, 입력 텍스트에서 she와 he가 몇 번 나타나는지를 계산하려면, 다음 규칙을 시도하십시오.
she s++
he h++
\n |. ;
여기서, 마지막 두 규칙은 he와 she와의 모든 것을 무시합니다. 그러나, she에 he가 포함되므로, lex는 she에 포함된 he를 인식하지 않습니다.
이 선택을 겹쳐쓰려면 REJECT 조치를 사용하십시오. 이 지시문은 lex에 다음 규칙으로 갈 것을 지시합니다. 그런 다음, lex는 입력 포인터의 위치를 최초 규칙이 실행된 위치로 조정하고 두 번째 선택 규칙을 실행합니다. 예를 들어, he가 포함된 인스턴스를 계산하려면, 다음 규칙을 사용하십시오.
she {s++;REJECT;}
he {h++;REJECT;}
\n |. ;
she가 나타난 횟수를 계산한 후에 lex는 입력 스트림을 거부하여 he가 나타난 횟수를 계산합니다. 이 경우, she는 he를 포함하지만, he는 she를 포함하지 않기 때문에 he에 대한 REJECT 조치를 생략할 수 있습니다. 다른 경우, 어느 입력 문자가 양쪽 클래스 모두의지를 결정하기가 어렵습니다.
일반적으로, REJECT는 lex의 목적이 입력 스트림을 분할하는 것이 아니라 입력한 일부 항목의 모든 예를 발견하는 것일 때, 그리고 이 항목의 인스턴스가 각각 다른 인스턴스를 중첩시키거나 포함할 때라면 언제든지 유용합니다.
플래그
-C C++ 컴파일러와 사용하도록 lex.yy.c 대신 lex.yy.C 파일을 작성합니다. I/O 스트림 라이브러리를 가져오려면, 매크로 _CPP_IOSTREAMS 또한 사용하십시오.
-n 통계 요약을 억제합니다. 유한 상태 기계에 대한 사용자 테이블 크기를 설정할 때, lex 명령은 사용자가 이 플래그를 선택하지 않으면 자동으로 요약을 생성합니다.
-t lex.yy.c를 파일 대신 표준 출력에 쓰십시오.
-v 작성된 유한 상태 기계 통계의 1행으로 된 요약을 제공합니다.
종료 상태
이 명령은 다음과 같은 종료 값을 리턴합니다.
0 성공적으로 완료되었습니다.
>0 오류가 발생했습니다.
예제
파일 lexcommands로부터 lex 명령을 가져와 lex.yy.c의 출력에 배치하려면, 다음 명령을 사용하십시오.
lex lexcommands
대문자를 소문자로 변환시키고, 행의 끝의 공백을 없애고, 여러 개의 공백을 하나의 공백으로 대체하는 lex 프로그램을 작성하려면, lex 명령 파일에 다음을 포함시키십시오.
%%
[A-Z] putchar(yytext[0]+ 'a'-'A');
[ ]+$ ;
[ ]+ putchar(' ');
파일
/usr/ccs/lib/libl.a 수행시간 라이브러리가 들어 있습니다.
/usr/ccs/lib/lex/ncform 유한 상태 기계를 정의합니다.
관련 정보
yacc명령