렉시칼 요소

이 섹션에서는 Q로 렉시칼 요소(정규식)를 설명합니다. 토큰 간의 주석, 공백, 탭, 캐리지 리턴 및 줄 바꾸기는 무시됩니다. 주석은 (* 및 *)로 구분된 문자 시퀀스입니다. 주석에 둘 이상의 행을 적용할 수 있습니다.
참고: 주석은 중첩될 수 없습니다.

구두점

구두점 기호는 다음과 같습니다.

= <> ~= ~<> < <= > >= + - * / -> ( ) { } [ ] " => |=> , $

식별자(ID)

ID는 문자 또는 밑줄 뒤의 여러 문자, 숫자 또는 밑줄로 구성됩니다. ID는 대소문자를 구분합니다.

키워드

키워드는 다음과 같습니다. 변수 또는 함수 이름으로 키워드를 사용할 수 없습니다.

표 1. 렉시칼 요소 키워드
and in real
부울 integer sort
current let string
else map then
false model there_exists
filter not this
for_all of traverse
if or true
implies over  

정수 리터럴(INTEGER_LITERAL)

정수 리터럴은 선택적 빼기 부호 뒤에 하나 이상의 10진수 숫자로 구성됩니다.

실수 리터럴(REAL_LITERAL)

실수 리터럴은 선택적 빼기 부호 뒤에 하나 이상의 10진수 숫자, 소수점 및 하나 이상의 10진수 숫자로 구성됩니다.

부울 리터럴(BOOLEAN_LITERAL)

부울 리터럴은 true 및 false입니다.

연관 리터럴(ASSOC_LITERAL)

연관 리터럴은 기본적으로 따옴표 대신 대괄호([])를 사용하는 문자열 리터럴입니다. 시퀀스 \]는 닫기 구분 기호를 이스케이프합니다.

문자열 리터럴(STRING_LITERAL)

문자열 리터럴은 따옴표로 묶인 문자의 시퀀스입니다. 행 전체에서 문자열을 확장할 수 없습니다(즉, 문자열에 이스케이프되지 않은 줄 바꾸기를 포함할 수 없음). 지원되는 이스케이프 시퀀스는 다음 표에 나열되어 있습니다.

이스케이프 시퀀스
대체 텍스트
\"
\\
\
\t
\r
캐리지 리턴
\n
줄 바꾸기

정규식 리터럴(REGEXP_LITERAL)

정규식 리터럴은 강세표로 묶인 문자 시퀀스입니다. 정규식 리터럴의 여러 문자에는 특수한 의미가 있습니다. 이러한 문자에 역슬래시가 없는 한 특수한 의미가 포함됩니다. 특수 문자는 ., \, [, ], ?, *, +, ^,$입니다. 정규식 리터럴에 문자 이스케이프 시퀀스를 포함할 수 있습니다. 허용되는 이스케이프 시퀀스는 \t, \r, \n\xdd이며, 탭, 캐리지 리턴, 줄 바꾸기 및 16진수 dd와 동일한 ASCII 코드가 있는 문자를 의미합니다.

정규식에 반복 구조가 있습니다. 이는 더 작은 하위 표현식으로부터 형성됩니다. 모든 정규식의 빌딩 블록은 단일 문자를 일치시키기 위한 표현식입니다. 이러한 기본 표현식에 다음과 같은 세 가지 양식이 있습니다.

  • 마침표(.)는 단일 문자와 일치하는 정규식입니다. 예를 들어, `.`는 a, 5, #, \n 및 " 등과 일치합니다.
  • 특수 문자 이외의 모든 문자 또는 역슬래시가 붙은 특수 문자는 해당 문자와 일치하는 정규식입니다. 예를 들어, `a`, `5` 및 `\*`는 a, 5 및 *와 각각 일치합니다.
  • 대괄호로 묶인 문자 세트는 세트에서 하나의 문자와 일치하는 정규식입니다. 예를 들어, `[abc]`는 a, b 또는 c 중 하나와 일치합니다. 세트의 첫 번째 문자가 캐럿(^)인 경우 정규식이 지정된 문자 세트의 보수와 일치합니다. 따라서 `[^abc]`는 a, bc 이외의 모든 문자와 일치합니다. 편의를 위해 문자 범위를 대시로 지정할 수 있습니다. 범위에는 하한과 상한 사이의 모든 문자가 포함됩니다. 예를 들어, `[a-zA-Z0-9]`는 모든 문자 또는 숫자와 일치합니다.

이러한 빌딩 블록에서 다음과 같은 방법으로 더 큰 정규식을 형성할 수 있습니다.

  • re1re2가 정규식인 경우 re1 re2(연결)는 양식 s1s2의 모든 문자열과 일치하는 정규식입니다. 여기서 s1re1과 일치할 수 있으며 s2re2와 일치할 수 있습니다. 예를 들어, `[ab][01]`은 a0, a1, b0b1과 일치합니다.
  • re가 정규식인 경우 re?는 영(0) 또는 하나의 re 발생과 일치하는 정규식입니다. 예를 들어, `ab?`는 a 또는 ab와 일치하고 `a[01]?`는 a, a0 또는 a1과 일치합니다.
  • re가 정규식인 경우 re*는 영(0) 또는 추가 re 발생과 일치하는 정규식입니다. 예를 들어, `ab*`는 a, ab, abbabbb 등과 일치하고 `a[01]*`는 a, a0, a1, a00, a01a11 등과 일치합니다.
  • re가 정규식인 경우 re+는 하나 이상의 re 발생과 일치하는 정규식입니다. 예를 들어, `ab+`는 ab, abbabbb 등과 일치하고 `a[01]+`는 a0, a1, a00, a01a11 등과 일치합니다.
    참고: 접미부 연산자 ?, *,+는 연결보다 더욱 긴밀하게 바인드합니다. 따라서 ab*는 (ab)*가 아닌 a(b*)를 의미합니다.

전체 정규식을 ^ 및 $가 포함된 문자열의 시작 또는 끝에 각각 앵커할 수 있습니다. re가 정규식이면 re는 문자열 시작에서 발생하는 경우에만 re로 일치 가능한 모든 문자열과 일치하는 정규식입니다. 마찬가지로, re$는 문자열 끝에서 발생하는 경우에만 re로 일치 가능한 모든 문자열과 일치하는 정규식입니다. 예를 들어, `^[01]+`는 a0 또는 a0110이 아닌 00110과 일치하며 `[01]+$`는 0a 또는 0110a가 아닌 00110과 일치합니다.


피드백