문제

나는 LUA에 대한 JFLEX LEXER를 작성하고 있으며 언어 사양의 특정 부분에 맞는 정규 표현을 설계하는 데 문제가 있습니다.

문자 그대로 문자열은 긴 괄호로 둘러싸인 긴 형식을 사용하여 정의 할 수 있습니다. 우리는 레벨 N의 오프닝 긴 괄호를 오프닝 스퀘어 브래킷으로 정의 한 다음 N 동일한 표지판과 다른 오프닝 스퀘어 브래킷을 정의합니다. 따라서 레벨 0의 오프닝 긴 브래킷은 [[[[[[[[[[[[[[[), 레벨 1의 오프닝 긴 괄호가 [= [등으로 쓰여진다. 닫는 긴 괄호는 유사하게 정의됩니다. 예를 들어, 레벨 4의 긴 괄호는] ====]로 작성됩니다. 긴 문자열은 모든 레벨의 오프닝 긴 괄호로 시작하여 같은 레벨의 첫 번째 긴 괄호에서 끝납니다. 이 괄호 형태의 리터럴은 여러 줄 동안 실행될 수 있고, 탈출 시퀀스를 해석하지 않으며, 다른 레벨의 긴 괄호를 무시할 수 있습니다. 적절한 레벨의 닫는 괄호를 제외하고는 무엇이든 포함 할 수 있습니다.

간단히 말해서, 나는 오프닝 긴 브래킷, 그 사이의 문자열 내용 및 닫는 긴 괄호와 일치하는 정규 표현을 설계하려고합니다. 일치는 오프닝 긴 괄호와 긴 브래킷을 닫는 것이 동일한 수의 동일한 징후를 가질 때만 발생하여 0 이상이 될 수 있습니다.

도움이 되었습니까?

해결책

\[(=*)\[.*?\]\1\]

1은 첫 번째 ()를 캡처합니다.

다른 팁

글쎄, 나는 정기적 인 표현으로 토큰 화하는 것만으로는이 작업에 충분하지 않습니다. 정규 표현은 충분히 강력하지 않습니다.

JFLEX에서 일반 정규 표현식을 사용하여 '='마크 수를 비교할 방법은 없습니다. Perl은 그에 대한 해킹을 할 것입니다 (위의 제안대로 1). 그러나 우리는 Perl 프로그래밍에 대해 이야기하는 것이 아니라 Jflex Lexer에 대해 이야기하고 있습니다.

해결책은 [=* [왼쪽 브래킷 토큰의 경우, 오른쪽 브래킷 토큰의 경우 ] =*]와 함께 이동 한 다음 위의 층 (파서)에서 길이가 일치하는 경우 비교하는 것입니다.

어쨌든, 당신은 llex.c의 LUA 소스 코드에서 read_long_string ()을보고 일반 표현식을 전혀 사용하지 않고 어떻게했는지 확인할 수 있습니다.

\[(=*)\[.*?\]\1\]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top