0

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

"6+9" ,      

输出必须有点像这样:

   Number : 6   
   Sign : +   
   Number: 9  

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

static char INTVALUE = ('0') ;    

这意味着我必须手动输入从 0 到 9 的每个数字,而且我不知道这种方法是否允许在我的输入中输入诸如 85 之类的数字。

顺便说一句,这是一个家庭作业,谢谢。

4

3 回答 3

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 ,然后通过实现类似这样的算法将其转换为最小 DFA 。在现实生活中,您通常会使用ANTLRJLex 之类的工具。

于 2014-10-24T23:06:23.607 回答
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;
}
于 2014-10-25T15:42:53.727 回答
0

为什么不为此使用正则表达式。这听起来最适合您尝试做的事情。

它的学习相当简单。查看此备忘单中的字符类 (\d) 和限定符 (+ ? )

要检查整数并将我们的以下内容加倍。

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

对于整数:

aStr.matches("-?\\d+");
于 2014-10-24T22:35:03.113 回答