문제

나는 첫 번째 주어진 인스턴스에 따라 문자열의 문자 java.util.regex.Pattern. 보다 공식적으로, 특정 정규 표현과 동등한 DFA를 고려할 때, 나는 시작 상태에서 모든 발신 전환 세트를 원한다.

An example:

Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+");
Set<Character> first = getFirstSet(p);

세트 first 다음 요소를 포함해야합니다.

{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' }

어떤 아이디어? 나는 DFA를 직접 구성하고 관련 상태를 그런 식으로 결정할 수 있다는 것을 잘 알고 있지만, 그런 번거 로움을 피하고 싶습니다 (읽기 : 그것은 나에게 그다지 가치가 없습니다). 내 호스트 언어는 실제로 스칼라이므로 모든 핵심 스칼라 리브 (가치가있는)에 액세스 할 수 있습니다.

도움이 되었습니까?

해결책

나는 당신이 정규 표현을 구문 분석하고 왼쪽에서 오른쪽에서 오른쪽으로 정규 표현식에서 작동하는 재귀 함수를 정의하여 그러한 첫 번째 세트를 구축 할 수 있다고 생각합니다.

일부는 간단합니다.

  • 시퀀스 : 첫 번째 (R1R2) = 첫 번째 (R1) + (첫 번째 (R1) 첫 번째 (R1) 첫 번째 (R2) Else Empty Set)
  • 대안 : 첫 번째 (R1 | R2) = 첫 번째 (R1) + 첫 번째 (R2)
  • 반복 : 첫 번째 (r*) = 첫 번째 (r) + ''
  • 문자 : 첫 번째 (c) = c
  • 문자 클래스 : 첫 번째 ([C1-CN]) = SET (C1, C2, ..., CN) ...

이것을 모든 프리미티브와 특수 플래그로 확장하십시오 정기 표현 방언은 알고 있으며 당신은 가기에 좋습니다.

다른 팁

당신은 그것을 재귀 적으로 해결할 수 있습니다 ...

  • 괄호와 호출의 스트립.
  • Toplevel 대안에서 분할하고 각 부분에 대해 재귀 적으로 호출하십시오.
  • 대안이 없다면
    • 왼쪽에서 첫 번째 없음 옵션 기호까지 모든 기호를 출력하십시오.
    • Charachter 그룹이있는 경우 모든 기호를 출력하십시오.

이 아이디어에는 아마도 많은 오류가있을 수 있지만 이것이 제가 시도하는 것입니다. 당신은 주장, 그룹 이름 및 수천 가지를 제거해야합니다. [^0-9]와 같은 역 캐릭터 클래스를 찾으면 많은 문자를 출력해야합니다.

그래서 나는 그것이 실제로 복잡한 문제라고 생각합니다.

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