我正在寻找一种在java中的词法解析器中实现一组数字的简单有效的方法。例如,我的输入代码如下:
"6+9" ,
输出必须有点像这样:
Number : 6
Sign : +
Number: 9
我遇到的问题是除了按如下方式实现之外我无法识别数字:
static char INTVALUE = ('0') ;
这意味着我必须手动输入0到9之间的每个数字,我不知道如果这样的方法甚至允许在我的输入中输入一个数字,如85.
这是顺便做作业的 谢谢 。
答案 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。在现实生活中,您通常会使用ANTLR或JLex等工具。
答案 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;
}