2010-12-07 3 views
1

정규식과 일치하는 문자열을 생성하기 위해 this algorithm을 작성했습니다. 정말 잘 작동하지만 아직 몇 가지 기능이 없습니다.문자 클래스를 반복 할 수 있도록이 정규식 역전 알고리즘을 어떻게 리팩터링해야합니까?

예를 들어, \d{3}을 뒤집을 때 먼저 번호를 선택하고 같은 번호를 3 번 ​​반복합니다. 나는 3 개의 다른 수를 선택하고 싶으면.

이 문제를 해결하는 가장 쉬운 방법은 \d을 토큰 목록에 밀어 넣고 후에 이후에 한정자를 지정하는 것입니다.

괜찮습니다. 멋지지만, 구문 분석하는 방법은 (a(b)){2}|(c)\3입니다. "나중에 평가"전략을 따르고 있다고 가정하면이 값은 "(a(b)), (a(b)) 또는 (c), \3"으로 토큰 화됩니다. 실제로 몇 가지 문제가 발생합니다. 난 그냥 실제로 나는 번호 참조 (abb\2입니다 \1이며, c\3입니다) 셀 수 있도록 \3 전에 언젠가 그것을 평가해야, 전체 덩어리로 (a(b))를 치료하고 반복 할 수 없습니다.

다른 문제는 내가 실제로 (a(b)), (a(b))을 두 번 반복하면 ... 숫자를 표시 할 때 한정 기호 정보를 잃어 버렸기 때문에 두 번 계산됩니다. 내가 문자열의 목록을 유지하지 않는 한, 오히려 그것이 계산되었는지 아닌지를 나타내는 더 복잡한 구조입니다. 즉, 또는 역 참조 목록에 즉시 넣습니다 ...하지만 평가하지 않은 채로 두 번 평가해야합니다. 작동하지 않으므로 평가하기 전에 평가해야합니다. 역 참조 목록 ...

그렇다면 (a|b){2}\1과 같은 것이 있습니까? I think\1마지막 캡처를 나타냅니다. 그래서 (a|b)을 즉시 평가할 수 없으며 정량화 될 수 있기 때문에 역 참조 목록에 결과를 던져 넣을 수 있습니다 ... 정량화 한 직후 즉시 평가할 수 있습니다.

나는 a different structure이 모든 것을 도와 줄 것이라고 생각했습니다. 하지만 여전히 한정어를 고려하는 방법을 모르겠습니다 ... 수량 한정자가 발견되면 즉시 노드를 복제하려고했으나 이것이 최선의 방법인지 확실하지 않습니다. 어쩌면 노드에 repeat-min, repeat-max 변수를 추가 할 수 있습니까?

답변

1

정규식이 할 수있는 한계에 도달했다고 생각합니다. 난 당신이해야 할 일은 고전적인 구문 분석, 입력 문자열에서 구문 분석 트리를 생성하고 다음 트리 분석 단계에서 당신이 당신의 게시물에 대해 이야기 분석의 유형을 할 생각합니다.

+0

그래서 나무 구조가 필요하다는 데 동의합니다 ... 확인. 나는 이것을 조금 가지고 놀고 내가 무엇을 생각해 낼 수 있는지 보게 될 것이다. – mpen