使用真实(正面和负面)数字加密后缀
我写了一个程序,允许从中缀到后缀表达式的翻译,但它只适用于一个数字[AZ][az][0-9]
。 如何才能使真实(正面和负面)数字成为可能?
Example: (50 + 3.75) + 50 --> 50 3.75 + 50 +
doTrans()允许从中缀到后缀的翻译
public String doTrans() { for (int j = 0; j < input.length(); j++) { char ch = input.charAt(j); theStack.displayStack("For " + ch + " "); switch (ch) { case '+': case '-': gotOper(ch, 1); break; case '*': case '/': gotOper(ch, 2); break; case '(': theStack.push(ch); break; case ')': gotParen(ch); break; default: output = output + ch; break; } } while (!theStack.isEmpty()) { theStack.displayStack("While "); output = output + theStack.pop(); } theStack.displayStack("End "); return output; }
这行output = output + ch;
的问题output = output + ch;
。 我找不到如何获得整数而不是一个数字的解决方案
你必须做一个词法分析 。 您必须将输入流转换为标记并对其进行分类。 目前您的程序已经完成,但它非常基础,那么您的令牌只包含一位数。 虽然令牌可能更复杂,从大于9的简单整数数字文字,浮点数字面值,字符串文字,简单运算符等开始。
您现在可能拥有的东西可以让您在后续调用中使用下一个标记来分析处理它并进入下一个标记。 就像是:
String input = "1 + 2"; int actPos = 0 ; .... char getNextToken() { return input.charAt(actPos++); }
你需要做的是重写getNextToken()
以便它给你一个“复杂”的令牌(由多个数字/字符组成,因此是一个字符串),你必须在下一步中进行分类。
String getNextToken() { String StringBuilder token = new StirngBuilde(); // extract the next token from the input stream // using a state automata witch comes to a final // state when a token was recognized or an erroneous input return token.toString(); }
EIDT
您需要编写有限状态机来分析输入流并生成令牌。
只是给你一个非常简单的例子(假设你已经阅读了上面链接中的定义),假设你有字母{'0','1','2','3','4','5','6','7','8','9'}
并且想要构建没有符号的整数标记。 您将整数定义为[0-9]+
你的状态机至少需要三个状态START
是启动状态, INTEGER
是最终和接受状态, ERROR
表示输入有错误。
现在您需要一个转换函数和一个状态转换表 ,这是实际输入并根据实际状态生成下一个状态。
状态转换表可能看起来像那样(非常基本,在没有输入时无法处理)
input +----------+----------+ | [0-9] | else | s +----------+----------+----------+ t | START | INTEGER | ERROR | a +----------+----------+----------+ t | INTEGER | INTEGER | ERROR | e +----------+----------+----------+ | ERROR | ERROR | ERROR | +----------+----------+----------+
所以,假设您有以下输入: 27
- 在开始时状态机具有状态
START
(实际状态) - 您读取第一个char
2
并将其与实际状态一起传递给转换函数 - 由于
2
是一个整数,因此您的函数会将您带到状态INTEGER
,因为这不是ERROR
您将它放在缓冲区中,您可以通过char构建令牌char。 - 现在,您阅读下一个char
7
并将其与实际状态INTEGER
一起传递给转换函数。 -
7
也是一个整数,与2
相同。 - 现在令牌缓冲区具有内容
27
并且您的状态机仍然具有状态INTEGER
witch是接受状态并且没有剩余输入。 此时,您可以将令牌缓冲区的内容作为下一个令牌返回。
现在假设您有输入: 2e7
你的状态机如上所述继续使用第一个char 2
和状态INTEGER
,然后来到e
巫婆不符合上面定义的整数的规则( [0-9]+
)。 将具有实际状态INTEGER
e
传递给转换函数导致状态ERROR
的转换。 此时,您可以通知e
位置/索引处的输入中存在错误。
我建议你阅读更多关于词法分析以及如何编写有限状态机来实现它。
有人说过,你总是可以使用像JLex那样为你生成这个分析代码的工具,但是你仍然必须为它定义一些规则来生成你希望它做的代码,这会让你回到阅读更多关于词法分析:)
祝你好运!