java - Jparsec - 解析简单数字

标签 java 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

那么我错过了什么?

最佳答案

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

关于java - Jparsec - 解析简单数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330760/

相关文章:

Java StringTokenizer 有 2 个参数?

java - 在 Clojure 中做 GUI 的最佳方法是什么?

java - 使用 for 循环将 swing 组件放在另一个组件下面?

java - 动画android中的NullPointerException

java - 如何选择表中包含多行不同类且每列具有相同类名的记录的链接

java - JParsec 版本号

java - 为什么 Terminals.tokenizer() 标记未注册的运算符/关键字?

java - jparsec 中的困惑