2012-01-28 32 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對象。解析器組合器強大地鍵入它們生成的對象類型,特別是終端上的組合器生成令牌,而不是字符串。