2012-01-28 4 views
0

Java 응용 프로그램 용 파서가 필요하므로 JParsec 라이브러리를 발견하고 간단한 계산기 문법으로 웹 사이트에서 자습서를 읽었습니다. 필자는 라이브러리를 사용하여 계획 한 작업을 수행 할 수 있어야하므로 샘플 계산기에서 문자열로 간단한 식별자를 구문 분석하는 데 십진수 구문 분석을 변경하는 프로토 타이핑을 시작했습니다. 현재 작업하고 싶은 유일한 작업은 문자열을 연결하는 '+'이지만 오류 메시지가 계속 표시됩니다.JParsec 버그로 간단한 문자열 표현 구문 분석

import org.codehaus.jparsec.OperatorTable; 
import org.codehaus.jparsec.Parser; 
import org.codehaus.jparsec.Parsers; 
import org.codehaus.jparsec.Scanners; 
import org.codehaus.jparsec.Terminals; 
import org.codehaus.jparsec.Tokens.Fragment; 
import org.codehaus.jparsec.functors.Binary; 
import org.codehaus.jparsec.functors.Map; 

public class Test 

{ 
enum BinaryOperator implements Binary<String> { 
    PLUS { 
     public String map(String a, String b) { 
      return a + b; 
     } 
    } 
} 

static final Parser<Void> IGNORED = Scanners.WHITESPACES.skipMany(); 

static final Parser<String> TEXT = Terminals.Identifier.TOKENIZER.map(new Map<Fragment, String>() { 
    public String map(Fragment arg0) { 
     return arg0.text()+"NEWTOSEEIFITSWORKING"; 
    } 
}); 

private static final Terminals OPERATORS = Terminals.operators("+"); 

static final Parser<?> TOKENIZER = Parsers.or(Terminals.Identifier.TOKENIZER, OPERATORS.tokenizer()); 

static Parser<?> term(String... names) { 
    return OPERATORS.token(names); 
} 

static <T> Parser<T> op(String name, T value) { 
    return term(name).retn(value); 
} 

static Parser<String> textparser(Parser<String> atom) { 
    Parser<String> parser = new OperatorTable<String>().infixl(op("+", BinaryOperator.PLUS), 10).build(atom); 
    return parser; 
} 

public static final Parser<String> TEXTPARSER = textparser(TEXT).from(TOKENIZER, IGNORED); 

public static void main(String[] args) 
{ 
    System.out.println(TEXTPARSER.parse("hello+world")); 
}} 

그리고 여기에 오류가 나는군요 있습니다 :

Exception in thread "main" org.codehaus.jparsec.error.ParserException: Cannot scan characters on tokens. 
line 1, column 1 
    at org.codehaus.jparsec.Parser.asParserException(Parser.java:591) 
    at org.codehaus.jparsec.Parser.run(Parser.java:600) 
    at org.codehaus.jparsec.MapParser.apply(MapParser.java:30) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    at org.codehaus.jparsec.MapParser.apply(MapParser.java:30) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    at org.codehaus.jparsec.BindNextParser.apply(BindNextParser.java:37) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    at org.codehaus.jparsec.Sequence2Parser.apply(Sequence2Parser.java:32) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    at org.codehaus.jparsec.ParserInternals.runNestedParser(ParserInternals.java:116) 
    at org.codehaus.jparsec.NestedParser.apply(NestedParser.java:32) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    at org.codehaus.jparsec.Sequence2Parser.apply(Sequence2Parser.java:32) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    at org.codehaus.jparsec.Parsers.parse(Parsers.java:97) 
    at org.codehaus.jparsec.Parser.parse(Parser.java:535) 
    at org.codehaus.jparsec.Parser.parse(Parser.java:546) 
    at org.codehaus.jparsec.Parser.parse(Parser.java:551) 
    at Test.main(Test.java:52) 
Caused by: java.lang.IllegalStateException: Cannot scan characters on tokens. 
    at org.codehaus.jparsec.ParserState.characters(ParserState.java:56) 
    at org.codehaus.jparsec.PatternScanner.apply(PatternScanner.java:36) 
    at org.codehaus.jparsec.ReturnSourceParser.apply(ReturnSourceParser.java:32) 
    at org.codehaus.jparsec.Parser.run(Parser.java:597) 
    ... 18 more 

내가 잘못 어떤 생각을 여기 내 코드는? 어떤 도움이라도 대단히 감사합니다!

답변

0

웹을 탐색하는이 오래된 질문에 좌불입니다. 귀하의 문제는 파서를 사용하여 String 객체를 파싱하는 것입니다. 파서 결합자는 생성되는 객체의 유형에 강력하게 유형화되며, 특히 터미널의 결합자는 문자열이 아닌 토큰을 생성합니다.