Compiler(3): flex

이규현·2024년 9월 23일

Flex

Pattern

입력에서의 패턴은 확장된 정규 표현식 세트를 사용하여 작성.
이들은 다음과 같음

x: 문자 'x'와 일치
.: 줄 바꿈 문자를 제외한 모든 문자(바이트)와 일치
[xyz]: 문자 클래스; 이 패턴은 'x', 'y' 또는 'z' 중 하나와 일치
[abj-oZ]: 문자 클래스에 범위가 포함된 경우; 'a', 'b', 'j'에서 'o'까지의 문자 또는 'Z'와 일치
[^A-Z]: 부정된 문자 클래스, 즉 해당 클래스에 있는 문자를 제외한 모든 문자와 일치. 이 경우, 대문자 이외의 모든 문자와 일치.
[^A-Z\n]: 대문자 또는 줄 바꿈 문자를 제외한 모든 문자와 일치
[a-z]{-}[aeiou]: 소문자 자음과 일치
r*: 0개 이상의 r(여기서 r은 모든 정규 표현식과 일치)
r+: 1개 이상의 r
r?: 0개 또는 1개의 r(즉, "옵션 r")
r{2,5}: 2개에서 5개 사이의 r
r{2,}: 2개 이상의 r
r{4}: 정확히 4개의 r
{name}: 'name' 정의의 확장(섹션 5 [형식], 6페이지 참조)
"[xyz]\"foo": 리터럴 문자열: [xyz]"foo
\X: X가 'a', 'b', 'f', 'n', 'r', 't' 또는 'v'인 경우, ANSI-C 해석의 '\x'. 그렇지 않으면 리터럴 'X'(연산자 '*' 등의 탈출에 사용)
\0: NUL 문자(ASCII 코드 0)
\123: 8진수 값 123의 문자
\x2a: 16진수 값 2a의 문자
(r): 'r'와 일치; 괄호는 우선순위를 무시하는 데 사용
(?r-s:pattern): 패턴을 해석할 때 옵션 'r'을 적용하고 's'는 생략. 옵션은 'i', 's' 또는 'x'의 문자 중 하나 이상일 수 있음.
'i'는 대소문자 구분 없음
'-i'는 대소문자 구분 있음
's''.' 구문이 어떤 단일 바이트와도 일치하도록 의미를 변경
'-s''.' 구문의 의미를 '\n'을 제외한 어떤 바이트와도 일치하도록 변경
'x'는 패턴에서 주석 및 공백을 무시. 공백은 역슬래시로 이스케이프되지 않으면, '""'안에 포함되지 않으면, 또는 문자 클래스 내에 나타나지 않으면 무시됨
다음은 모두 유효합니다:

(?:foo): (foo)와 동일

(?i:ab7):([aA][bB]7)와 동일

(?-i:ab):(ab)와 동일

(?s:.): [\x00-\xFF]와 동일

(?-s:.): [^\n]와 동일

(?ix-s: a . b): ([Aa][^\n][bB])와 동일

(?x:a b): ("ab")와 동일

(?x:a\ b): ("a b")와 동일

(?x:a" "b): ("a b")와 동일

(?x:a[ ]b): ("a b")와 동일

(?x:a/* comment */bc): (abc)와 동일

(?# comment ): '()'내에서 모든 것을 생략. 첫 번째 ')'문자에서 패턴 종료. 주석에 ')' 문자를 포함할 수는 없음. 주석은 여러 줄에 걸칠 수 있음.

rs: 정규 표현식 'r' 뒤에 정규 표현식 's'가 오며, 이를 연결이라고 함.

r|s: 'r' 또는 's' 중 하나

r/s: 's'가 뒤따를 때만 'r'과 일치. 's'로 일치 여부를 결정할 때 텍스트가 포함되지만, 작업이 실행되기 전에 입력으로 반환됨. 따라서 작업은 'r'과 일치한 텍스트만 확인. 이 패턴 유형을 후행 문맥이라고 함. ('r/s'의 조합 중 몇 가지는 flex에서 올바르게 일치하지 않음. 위험한 후행 문맥에 대한 자세한 내용은 섹션 24 [제한 사항], 74페이지 참조.)

^r: 줄의 시작에서만 'r'과 일치(즉, 스캔을 시작하거나 줄 바꿈을 스캔한 직후)

r$: 줄 끝에서만 'r'과 일치(즉, 줄 바꿈 직전). 'r/\n'과 동일.

flex의 "줄 바꿈" 개념은 flex를 컴파일하는 데 사용된 C 컴파일러가 '\n'을 어떻게 해석하는지에 정확히 일치함; 특히 일부 DOS 시스템에서는 입력에서 '\r'을 필터링하거나 'r/\r\n'을 명시적으로 사용해야 함.

<s>r: 시작 조건에서만 'r'과 일치(시작 조건에 대한 논의는 섹션 10 [시작 조건], 21페이지 참조).

<s1,s2,s3>r: s1, s2 또는 s3의 시작 조건 중 하나에서만 'r'과 일치.

<*>r: 독점적인 시작 조건에서도 'r'과 일치.

<<EOF>>: 파일의 끝.

<s1,s2><<EOF>>: 시작 조건 s1 또는 s2에서 파일 끝.

0개의 댓글