2012-01-28 25 views
0

Javaアプリケーション用のパーサが必要なので、JParsecライブラリを発見し、簡単な電卓文法で自分のWebサイトでチュートリアルを行った。ライブラリを使用して計画したことを実行できるはずだから、サンプルCalculatorから非常に単純な識別子を文字列として解析するために小数点のリテラルを解析するプロトタイプを開始したようです。私が今作業したい唯一の操作は文字列を連結するために '+'ですが、エラーメッセージが出ています。ここに私のコードは次のとおりです。JParsecの単純なString式の解析の不具合

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オブジェクトを解析していることです。パーサーコンビネータは、生成するオブジェクトの型に強く型付けされます。具体的には、Terminalsのコンビネータは文字列ではなくトークンを生成します。

関連する問題