2011-01-26 2 views
1

가능한 경우 Java 스캐너를 사용하여 dice notation의 구현을 파싱하는 재귀 적 파생을 작성하고 싶습니다. 이전에 a question about it을 열어 보았습니다.하지만 요구 사항이 너무 단순 해 보였습니다. 그래서 저는 여기에 그 요구를 전 세계에서 제시 할 것입니다.주사위 표기법 (재귀 적 하강 파싱 구현) : 구분 기호가없는 스캐너

정말 java.util.Scanner 클래스와 함께 사용하면 좋겠지 만, 필요한 경우 내 자신의 스캐너를 작성합니다. 나는 지금 이것을 피하고 싶습니다.

Scanner s = new Scanner("1d6"); 
if (s.hasNextInt()) { 
    s.nextInt(); 
} else { 
    throw new java.text.ParseException(); 
} 

을하지만, 분명히 그것은 실패 유지 :

expression = { whitespace } , [ plusminus ] , roll , { plusminus , (roll | number , { whitespace }) } ; 
roll   = [ number ] , ("d" | "D") , (number | "%") , [ "-" ("L" | "H") ] , { whitespace } ; 
plusminus = ("+" | "-") , { whitespace } ; 
number  = nonzerodigit , { digit } ; 
digit  = nonzero digit | "0" ; 
nonzerodigit = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; 
whitespace = ? Java definition of a whitespace ? ; 

그래서 사실

, 나는 다음과 같은 코드를 작성하려고했습니다.

이전 질문에서 제안한대로 findWithinHorizon 메서드를 시도했지만 실제로 다음 패턴을 찾고 내가 어디에 있는지 확인하지 않습니다. 그래서 내가 필요로하지 않는 경우 문자열을 "푸시 백"할 수 없습니다 ...

그래서이 컨텍스트에서 java.util.Scanner를 사용해야하는 방법에 대한 제안은 무엇입니까? 또는 내 자신의 스캐너를 작성해야합니까?

답변

3

java.util.Scanner를 사용하지 마십시오. JParsec의 디자인을 살펴보십시오.

+0

JParsec에 대한 정보를 제공해 주셔서 감사합니다. 나는 그 디자인을 사용할 것이라고 생각합니다. 너무 많은 시간이 걸리면 저는 도서관 자체를 사용할 것입니다. 그러나 왜 스캐너를 사용하지 말아야하는지 설명 할 수 있습니까? 더 나은 대안 (예 : JParsec) 또는 다른 이유가 있기 때문에 그것이 목적이 아니기 때문입니까? –

+0

당신의 문법은이 스캐너가 설계 한 것과 너무 다릅니다. –

+0

감사합니다. 대단히 감사합니다! –

1

문법 작업을 할 때는 ANTLR을 사용해야합니다. 파서 생성기입니다. 문법을 통해 파서를 쉽게 생성하고이 클래스를 사용하여 표현식을 파싱 할 수 있습니다.

+0

아니, 제 손으로 끝내고 싶습니다. 그래서 파서가 실제로 어떻게 작동 하는지를 배웁니다. 그래서 제목에 "재귀 적 파싱 구현 구현"괄호를 명시 적으로 지정했습니다. –