2011-04-10 5 views
2

lex (flex 2.5.35)에서 긍정적 인 lookbehind 어설 션이 필요합니다. 문서를 조사한 후에는이를 직접 수행 할 방법이 없습니다. lookahead 어서션 (r/s 구문)과 유사하지만 lookbehind가 아닙니다. 동일한 효과를 얻는 가장 좋은 방법은 무엇입니까? 여기 lookbehind 어설 션을 lex에서 어떻게 사용할 수 있습니까?

은 예입니다 : 내 스캐너 사양 파일의 folling 규칙이 말 : 나는 'B'다음에 'D'를 일치합니다 어떻게

a   printf("matched a "); 
b   printf("matched b "); 
c   printf("matched c "); 
d   printf("matched d "); 

을하고, 그 때문에 'B'그 자체, 'ABD'의 입력에 내가 얻을 것 :

matched a matched b matched d following b 

을하지만 문자열 'ACD'에 대한

matched a matched c matched d 

규칙 :

bd  printf("matched d following b "); 

분명히 작동하지 않습니다. 내가 PCRE lookbehinds이 있다면

matched a matched d following b 

내가 쓸 수 :

(?<=b)d printf("matched d following b "); 

을 모두 잘 될 것이다,하지만 렉스는이 기능을 지원하지 않습니다 'ABD'것이 출력합니다. 긍정적 인
(?<! ...) 부정적인

그리고 PCRE에 대한

(?<= ...)이 (양 또는 음) 고정 길이 보이는 비하인드 필요합니다

답변

0

더 복잡한 스캐너를 사용하면 start conditions으로 원하는 것을 얻을 수 있습니다. 시작 조건을 사용하면 이전에 일치 한 내용을 기반으로 규칙을 조건부로 활성화 할 수 있습니다.

$ echo abcd | ./5615080 
matched a 
matched b 
matched c 
matched d 

$ echo abdd | ./5615080 
matched a 
matched b 
matched d following b 
matched d 
+0

흠. 이것은 꽤 복잡해 보이지만 다른 방법은 없다고 생각한다. 도와 주셔서 감사합니다. . – justinrstout

0

는 PCRE 구문 뒤의 모습이있다.

렉스에있는 경우, 아마도이 형식 일 것입니다.

+0

플렉스는 현재 다음을 지원하지 않습니다 : 내가 얻을이 스캐너와

%x matched_b %% <INITIAL,matched_b>{ a { printf("matched a\n"); BEGIN(INITIAL); } b { printf("matched b\n"); BEGIN(matched_b); } c { printf("matched c\n"); BEGIN(INITIAL); } } d printf("matched d\n"); <matched_b>d { printf("matched d following b\n"); BEGIN(INITIAL); } 

예를 들면 다음과 같습니다. 출처 : http : //web.archive.org/web/20160525061545/http : //flex.sourceforge.net : 80/manual/Patterns.html – starbeamrainbowlabs

+0

@starbeamrainbowlabs - 그래, 그것이 무엇이 아닌지 왜 말하지 않겠습니까? 시간을 절약하십시오. 나는 렉스를 피하고 있었는데, 이제는 사용하지 않을 것임을 알았습니다. – sln

+0

나는 이해하지 못합니다. 나는 내 지식의 최상면에서 flex가 이것을 지원하지 않는다고 분명히 말했습니다. 이것은 flex가 아닌 것입니다. 내가 뭔가를 여기에서 놓치고있는 느낌을 얻는다 :-( – starbeamrainbowlabs

1

미리보기 단언 만 있다면 두 가지 가능성을 생각할 수 있습니다.

  1. 문자열을 반대로하고 역상 패턴을 검색하십시오. 귀하의 패턴이 지금보다 앞서 가기 전에 정상적으로 있었던 것은 무엇입니까?

  2. 오른쪽에서 왼쪽으로 구문 분석 할 수있는 정규 표현식을 생각해보십시오. 아마도이 문구는 미리보기와 함께 도움이 될 수 있습니다.

그렇지 않으면 일부 예제 문자열을 게시해야하고 결과로 기대 한대로, 아마도 뒤에서 어설 션을 사용하지 않고도 달성 할 수 있습니다.

관련 문제