HOP::Lexer을 사용하여 BlitzMax 모듈 소스 코드를 스캔하여 일부 데이터를 가져옵니다. 현재 제가 관심을 갖고있는 데이터 중 하나는 모듈 설명입니다.겹쳐진 토큰이있는 HOP :: Lexer
현재 ModuleInfo "Description: foobar"
또는 ModuleInfo "Desc: foobar"
의 형식으로 설명을 찾고 있습니다. 이것은 잘 작동합니다. 하지만 슬프게도, 내가 스캔 한 대부분의 모듈은 설명 블록 안에 다른 곳에 정의 된 설명을 가지고 있습니다. BlitzMax에서 실제로 문서 생성기가 예상하는 것처럼 일반적인 방법입니다.
모든 모듈의 설명이 기본 소스 파일에 정의되어 있습니다.
Rem
bbdoc: my module description
End Rem
Module namespace.modulename
이것은 실제로 문제가되지 않습니다. 그러나 End Rem 다음의 줄에는 원하는 데이터 (모듈 이름)도 들어 있습니다. 이것은 토큰의 정의가 서로 겹치고 처음 발견 된 후에는 중단 된 위치 (스캔되는 내용의 위치)에서 계속되므로 문제입니다. 모듈 이름의 토큰이 아무것도 감지하지 못한다는 것을 의미합니다.
예, 토큰 순서가 정확한지 확인했습니다. 커서를 줄 바꿈으로 옮길 수는 없습니다.
모듈 정의 위에있는 램 엔드 램 블록 내에서의 설명을 페치 (밖으로 일 아니지만, 현재의 테스트 케이스에 대해 동작하는)에 대한 코드의 작은 조각 :
[ 'MODULEDESCRIPTION',
qr/[ \t]*\bRem\n(?:\n|.)*?\s*\bEnd[ \t]*Rem\nModule[\s\t]+/i,
sub {
my ($label, $value) = @_;
$value =~ /bbdoc: (.+)/;
[$label, $1];
}
],
을 따라서의 내 테스트 사례 먼저 하나의 주석을 검색 한 다음 위의 블록 (MODULEDESCRIPTION), 블록 주석 (Rem-End Rem), 모듈 이름 등을 검색합니다.
현재 제가 생각할 수있는 유일한 해결책은 다음과 같습니다. 모듈 설명에 대해서만 두 번째 렉서를 사용합니다. HOP :: Lexer를 통해 내가 원하는 것까지도 가능합니까? 내 렉서의
소스 (약간 수정 버전)을 MODULEDESCRIPTION을 추가하여 https://github.com/maximos/maximus-web/blob/develop/lib/Maximus/Class/Lexer.pm