具有整数文字的解析器

时间:2014-10-24 22:27:28

标签: java parsing integer lexical

我正在寻找一种在java中的词法解析器中实现一组数字的简单有效的方法。例如,我的输入代码如下:

"6+9" ,      

输出必须有点像这样:

   Number : 6   
   Sign : +   
   Number: 9  

我遇到的问题是除了按如下方式实现之外我无法识别数字:

static char INTVALUE = ('0') ;    

这意味着我必须手动输入0到9之间的每个数字,我不知道如果这样的方法甚至允许在我的输入中输入一个数字,如85.

这是顺便做作业的 谢谢 。

3 个答案:

答案 0 :(得分:1)

对于最简单的语法,您确实可以使用正则表达式:

import java.util.regex.*;
// ...
String expression = "(10+9)*2";
Pattern pattern = Pattern.compile("\\s*(\\d+|\\D)\\s*");
Matcher matcher = pattern.matcher(expression);
while (matcher.find()) {
    String token = matcher.group(1);
    System.out.printf("%s: '%s'%n", 
        token.matches("\\d+") ? "Number" : "Symbol", 
        token);
}

在编译器构建课程中,您可能需要构建NFA,然后通过实现this one之类的算法将其转换为最小DFA。在现实生活中,您通常会使用ANTLRJLex等工具。

答案 1 :(得分:0)

为什么不使用正则表达式。这听起来最适合你想要做的事情。

它相当简单易学。查看此cheatsheet

中的字符类(\ d)和Quatifiers(+?)

要检查整数并将以下内容加倍:

aStr.matches("-?\\d+(\\.\\d+)?");

只是整数:

aStr.matches("-?\\d+");

答案 2 :(得分:0)

你也可以做这样简单的事情:

public List<Token> lex(String s) {
    List<Token> result = new ArrayList<Token>();

    int pos = 0;
    int len = s.length();
    while (pos < len) {
        switch (s.charAt(pos)) {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            {
                int end = pos;
                do {
                    ++end;
                } while (end < len && s.charAt(end) >= '0' && s.charAt(end) <= '9');

                result.add(new Number(s.substring(pos, end)));
                pos = end;
                break;
            }
        case '+':
            {
                result.add(new Operator("+"));
                ++pos;
                break;
            }
        // ...
        }
    }

    return result;
}