그리고 [내가]가 될 수는 [B] 중첩 [/ B]는 오히려 [/ I] 난 당신이 그것을 것을 제외 할 찾고있는 것과 매우 유사한 파서를 작성했습니다
추한 것 네 번째 예제에 오류를 던지십시오. "[i] 내의 예기치 않은 종료 태그 [/ b]"의 효과
나는 싶은 것은 매우 행할 수 있다고 생각하지만, 내부적으로는 원래의 텍스트 인 것처럼 트리를 만들 것입니다 :
"And the [b]nesting [i]can be[/i][/b][i] rather[/i] ugly"
. (XML로 변환 할 필요가 없다면 필요하지 않다고 생각합니다 .XML로 변환 할 필요가 없다면 각 섹션이 형식 조합으로 표시되는 텍스트 섹션의 링크 된 목록을 유지할 수 있습니다)
이 문제에 대한 두 가지 가능한 접근법이 마음에 듭니다 (물론 더 나은 가능성이있을 수 있습니다). 1) 누락 된 끝을 사전 처리하고 삽입하고 필요한 경우 태그를 시작하십시오. 2) 구문 분석 트리를 작성하고 겹치는 태그가있는 경우 현재 컨텍스트를 기반으로 누락 된 태그를 의미합니다. 나는 접근 번호 (2)가 더 간단하고 깨끗하다고 생각한다.
AbstractElement 클래스, AbstractElement를 확장하는 TextElement 클래스 및 AbstractElement를 확장하고 AbstractElement 유형의 하위 요소 목록을 포함하는 Tag 클래스가있는 복합 패턴을 기반으로 트리를 모델링 할 수 있습니다.
루트 태그 인스턴스를 만드는 것으로 시작합니다. 그런 다음 rootTag.parse (text)를 호출합니다. 3 가지 유형의 토큰, 즉 텍스트, 시작 태그 및 종료 태그를 반환 할 수있는 스캐너가 필요합니다. 스캐너를 사용하면 토큰을 정상적으로 스캔 토큰보다 먼저 반환 할 수 있습니다. 이렇게하면 예기치 않은 종료 태그를 만나고 처리 한 후에 새 시작 태그 토큰을 밀어 넣을 수 있습니다. 당신은 또한 당신이 입력으로 끝났을 때 알아야 할 것입니다. 나는 4 번째 토큰 타입을 사용할 것이다.
/* methods within class Tag */
public void parse(String text) {
MyScanner scanner = new MyScanner(text);
parse(scanner);
}
/* returns next token */
private Token parse(MyScanner scanner) {
Token firstToken = scanner.getNextToken();
return parse(scanner,firstToken);
}
private Token parse(MyScanner scanner) {
Token firstToken = scanner.getNextToken();
return parse(scanner,firstToken);
}
private Token parse(MyScanner scanner, Token token) {
while (!token.isDone() && !token.isEndTag()) {
if (token.isStartTag()) {
Tag subTag = new Tag(token.getValue());
token = scanner.getNextToken();
token = subTag.parse(scanner,token);
addElement(subTag);
}
else {
TextElement text = new TextElement(token.getValue());
addElement(text);
token = scanner.getNextToken();
}
}
if (token.isEndTag()) {
if (!token.getValue().equals(getName()) {
scanner.push(new Token(Token.START_TAG,token.getValue()));
}
else {
token = scanner.getNextToken();
}
}
return token;
}
그래서 당신은 구문 분석 할 수 있다면 "그리고는 [B] 중첩 [내가] 수 있습니다 [/ B]가 아니라 [/ 난] 추한", 다음이 생성을하셔야합니다.
rootTag.parse should be adding:
TextElement: "And the "
Tag: "b"
TextElement: "nesting "
Tag: "i"
TextElement: "can be"
(... at this point the odd [/b] is encountered ...)
(... push "i" start tag on the scanner ...)
(... here the [/b] is encountered (again) ...)
Tag: "i" (this was scanned because it had been pushed to the scanner)
TextElement: " rather"
TextElement: " ugly"
참고 : 텍스트 영역 내에서의 코딩은 테스트 및 디버깅에 적합하지 않습니다. 이 답변을 힌트 또는 가능성으로 받아 들여야합니다.
와우. 고맙습니다. 귀하의 샘플 코드는 거의 모든 문제를 해결했습니다 :) –
감사합니다. 행운을 빕니다. 난 그냥 오타를 수정하고 푸시 통화에 잘못된 매개 변수를 전달하고 있었고, 지금도 고쳐졌습니다. – rayd09