代码之家  ›  专栏  ›  技术社区  ›  Marcin

Jparsec-解析简单数字

  •  1
  • Marcin  · 技术社区  · 16 年前

    下面是一段简单的代码:

    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"));
      }
    }
    

    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
    

    那么我错过了什么?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Simon Nickerson    16 年前

    我不是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"));
        }
    }