2012-01-28 30 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对象。解析器组合器强大地键入它们生成的对象类型,特别是终端上的组合器生成令牌,而不是字符串。