나중에 정규에서 일치하는 숫자를 평가하는 방법은 무엇입니까? -Lexing Fortran 'H'편집 디스크립터 편집자

StackOverflow https://stackoverflow.com/questions/2216843

문제

나는 사용 중입니다 주름 Fortran 형식 문자열을 해석합니다. 나는 동정인 'H'편집 디스크립터 그것은 형식입니다

엑스시간CCCCC ...

어디 엑스 'H'이후에 읽을 문자 수를 지정합니다.

Ply는 단일 정규 표현식과 토큰과 일치하지만 정규 표현을 사용하여 위의 수행에 어려움이 있습니다. 나는 같은 것을 찾고 있습니다.

(\d+)[Hh].{\1}

어디 \1 정수로 구문 분석되어 동선의 일부로 평가되었습니다. 그러나 그렇지 않습니다.

그것은 것 같습니다 동일한 regex에서 나중에 일치하는 숫자를 사용할 수 없습니다., 이것이 사실입니까?

Ply를 사용할 수있는 다른 솔루션이 있습니까?

도움이 되었습니까?

해결책

Regex는 그런 일을 할 수 없습니다. 그래도 해킹 할 수 있습니다.

(1[Hh].|2[Hh]..|3[Hh]...|etc...)

못생긴!

다른 팁

이것이 Regexps가 Lexer를 대체 할 수 있다는 생각의 것입니다.

짧은 버전 : 정규 표현식은 "정기적"이라는 모든 가능한 언어의 작은 하위 집합 만 다룰 수 있습니다 (Big Shrows, I Know). 그러나 "일반"은 "단순"에 대한 인간의 이해에 동형이 아니므로 매우 간단한 언어조차도 비 규제 표현을 가질 수 있습니다.

간단한 언어를 위해 Lexer를 쓰는 것은 매우 어렵지 않습니다.

주제에 대한 자원에 대한 정식 스택 오버플로 질문은 컴파일러 작성 배우기.


아. 나는 그 질문을 오해 한 것 같습니다. Mea Culpa.

나는 Ply에 익숙하지 않으며 Flex를 사용한 지 오래되었지만 먹을 것이라고 생각합니다. 모든 수 그러면 다음 숫자 확인하다 규칙이 준수 된 경우 관련 코드 블록에서.

pyparsing에는 countedArray라고 불리는 이와 매우 유사한 적응 적 표현이 포함됩니다. CountedArray (expr)는 선행 정수 'n'을 구문 분석 한 다음 expr의 'n'사례를 구문 분석하여 전체 배열을 단일 목록으로 반환합니다. 이것이 작동하는 방식은 카운트 러레이가 선행 정수 표현을 구문 분석하고 이후에 이르기까지 전방 표현을 구문 분석하는 것입니다. 선행 정수 표현식에는 다음을 'n'*expr에 할당하는 구문 분석 조치가 첨부되어 있습니다. 그런 다음 파사 파서는 계속해서 다음과 같은 'n'expr 's를 구문 분석합니다. 그래서 그것은 일종의 자체 수정 파서입니다.

표현을 구문 분석하기 위해 이것은 다음과 같은 것처럼 보일 것입니다.

integer = Word(nums).setParseAction(lambda t:int(t[0]))
following = Forward()
integer.addParseAction(lambda t: following << Word(printables+" ",exact=t[0]))
H_expr = integer + 'H' + following
print H_expr.parseString("22HThis is a test string.This is not in the string")

인쇄물:

[22, 'H', 'This is a test string.']

Ply가 비슷한 것이 있다면 아마도이 기술을 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top