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
내가 잘못 어떤 생각을 여기 내 코드는? 어떤 도움이라도 대단히 감사합니다!