fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10.  
  11. static String next(Scanner s) {
  12. String tok;
  13. do {
  14. tok = s.next();
  15. } while (s.hasNext() && tok.trim().length() == 0);
  16. return tok;
  17. }
  18.  
  19. static void require(Scanner s, String mustBe) {
  20. if (!next(s).equals(mustBe)) {
  21. throw new RuntimeException("Invalid token.");
  22. }
  23. }
  24.  
  25. static String merge(String delim, List<String> operands) {
  26. StringBuilder res = new StringBuilder();
  27. boolean first = true;
  28. for (String op : operands) {
  29. if (!first) {
  30. res.append(delim);
  31. } else {
  32. first = false;
  33. }
  34. res.append(op);
  35. }
  36. return res.toString();
  37. }
  38.  
  39. static String convertInfix(Scanner s) {
  40. String tok = next(s);
  41. if (tok.equals("AND") || tok.equals("OR") || tok.equals("NOT") || tok.equals("FUNC")) {
  42. require(s, "(");
  43. List<String> operands = new ArrayList<>();
  44. while (true) {
  45. operands.add(convertInfix(s));
  46. String delim = next(s);
  47. if (delim.equals(")")) {
  48. break;
  49. }
  50. }
  51. if (tok.equals("AND")) {
  52. return "("+merge("&&", operands)+")";
  53. }
  54. if (tok.equals("OR")) {
  55. return "("+merge("||", operands)+")";
  56. }
  57. if (tok.equals("NOT")) {
  58. return "!("+operands.get(0)+")";
  59. }
  60. // FUNC
  61. return "FUNC("+merge(", ", operands)+")";
  62. } else if (tok.equals("(")) {
  63. String res = convertInfix(s);
  64. require(s, ")");
  65. return res;
  66. } else {
  67. // A <operand> B
  68. return tok + next(s) + next(s);
  69. }
  70. }
  71.  
  72. static String convertInfix(String s) {
  73. Scanner scanner = new Scanner(s);
  74. scanner.useDelimiter("\\s|\\b|(?<=[()])");
  75. return convertInfix(scanner);
  76. }
  77.  
  78. public static void main (String[] args) throws java.lang.Exception
  79. {
  80. String expr = "AND(OR((NOT(A != null)), OR(FUNC(3<4, 1==1), 1<2, FUNC(5<6, 2<3))), 2<3)";
  81. System.out.println(convertInfix(expr));
  82. }
  83. }
Success #stdin #stdout 0.14s 321408KB
stdin
Standard input is empty
stdout
((!(A!=null)||(FUNC(3<4, 1==1)||1<2||FUNC(5<6, 2<3)))&&2<3)