2009-08-25 2 views
1

Вот простой фрагмент кода:Jparsec - разбор простых чисел

import org.codehaus.jparsec.Parser; 
import org.codehaus.jparsec.Terminals; 
import org.codehaus.jparsec.functors.Map; 

public class Test { 
    static final Parser<Double> NUMBER = Terminals.DecimalLiteral.PARSER.map(
    new Map<String, Double>() { 
     public Double map(String s){ 
     return Double.valueOf(s); 
    } 
    }); 

    public static void main(String[] args) { 
    System.out.println(NUMBER.parse("234234234")); 
    } 
} 

который предполагается напечатать ряд, а именно 234234234. Вместо этого он печатает:

Exception in thread "main" org.codehaus.jparsec.error.ParserException: Parser not on token level 
line 1, column 1 
    at org.codehaus.jparsec.Parser.asParserException(Parser.java:673) 
    at org.codehaus.jparsec.Parser.run(Parser.java:682) 
    at org.codehaus.jparsec.MapParser.apply(MapParser.java:30) 
    at org.codehaus.jparsec.Parser.run(Parser.java:679) 
    at org.codehaus.jparsec.Sequence2Parser.apply(Sequence2Parser.java:32) 
    at org.codehaus.jparsec.Parser.run(Parser.java:679) 
    at org.codehaus.jparsec.Parsers.parse(Parsers.java:97) 
    at org.codehaus.jparsec.Parser.parse(Parser.java:617) 
    at org.codehaus.jparsec.Parser.parse(Parser.java:628) 
    at org.codehaus.jparsec.Parser.parse(Parser.java:633) 
    at Test.main(Test.java:51) 
Caused by: java.lang.IllegalStateException: Parser not on token level 
    at org.codehaus.jparsec.ScannerState.getToken(ScannerState.java:68) 
    at org.codehaus.jparsec.IsTokenParser.apply(IsTokenParser.java:30) 
    at org.codehaus.jparsec.Parser.run(Parser.java:679) 
    ... 9 more 

Так что я не хватает ?

ответ

0

Я на самом деле не специалист в jparsec, но следующее альтернативное определение NUMBER, кажется, работает:


import org.codehaus.jparsec.Parser; 
import org.codehaus.jparsec.Terminals; 
import org.codehaus.jparsec.Tokens.Fragment; 
import org.codehaus.jparsec.functors.Map; 

public class Test 
{ 
    static final Parser NUMBER = Terminals.DecimalLiteral.TOKENIZER.map(
      new Map<Fragment, Double>() { 
       public Double map(Fragment arg0) { 
        return Double.valueOf(arg0.text()); 
       } 
      }); 

    public static void main(String[] args) 
    { 
     System.out.println(NUMBER.parse("234234234")); 
    } 
} 

+0

Это делает в самом деле! Мне не хватало части «Фрагмент». Карта должна быть параметризована с помощью , но кроме этого она отлично работает. – Marcin

+0

Упс, хорошо пятнистый. Это была проблема с моей разметкой. Вы не имеете в виду Map хотя? –