home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1997 August / PCO0897.ISO / filesbbs / os2 / fp1os2.arj / OS2 / DATA / 49 / C / 0 / F_26836 / JScriptExprParser.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-05-15  |  6.2 KB  |  301 lines

  1. import java.io.PrintStream;
  2.  
  3. public class JScriptExprParser extends JSbxBase {
  4.    private JScriptParser aParser;
  5.    private JScriptErrorLog aErrorLog;
  6.    private JScriptExprNode aActNode;
  7.    private static final int _EXPRESSION_NOT_FOUND = 0;
  8.    private static final int _EXPRESSION_BREAK = 1;
  9.    private static final int _EXPRESSION_CONTINUE = 2;
  10.    private static final int _EXPRESSION_SPECIAL_TERM = 3;
  11.  
  12.    public JScriptExprParser() {
  13.       this((JScriptParser)null, (JScriptErrorLog)null);
  14.    }
  15.  
  16.    public JScriptExprParser(JScriptParser var1) {
  17.       this(var1, (JScriptErrorLog)null);
  18.    }
  19.  
  20.    public JScriptExprParser(JScriptParser var1, JScriptErrorLog var2) {
  21.       this.Init();
  22.       this.aParser = var1;
  23.       this.aErrorLog = var2;
  24.    }
  25.  
  26.    public boolean IsLastEmptyOrOperator() {
  27.       return this.aActNode == null || this.aActNode instanceof JScriptExprOperator && !((JScriptExprOperator)this.aActNode).HasCorrectOperands();
  28.    }
  29.  
  30.    public JScriptParserExpression ParseIt() throws JScriptExprParserException, JSbxExceptionBase {
  31.       return this.ParseIt(false, false, false);
  32.    }
  33.  
  34.    public JScriptParserExpression ParseIt(boolean var1) throws JScriptExprParserException, JSbxExceptionBase {
  35.       return this.ParseIt(var1, false, false);
  36.    }
  37.  
  38.    private JScriptParserExpression ParseIt(boolean var1, boolean var2) throws JScriptExprParserException, JSbxExceptionBase {
  39.       return this.ParseIt(var1, var2, false);
  40.    }
  41.  
  42.    private boolean LastTokenWasEOL() {
  43.       JScriptToken var1 = this.aParser.GetLastTokenForExpParser();
  44.       if (var1 != null && this.aActNode != null) {
  45.          return var1.GetID() == 134;
  46.       } else {
  47.          return false;
  48.       }
  49.    }
  50.  
  51.    private JScriptParserExpression ParseIt(boolean var1, boolean var2, boolean var3) throws JScriptExprParserException, JSbxExceptionBase {
  52.       JScriptExprNode var7 = this.aActNode;
  53.       this.aActNode = null;
  54.       JScriptTokenPosition var5 = new JScriptTokenPosition();
  55.  
  56.       JScriptToken var4;
  57.       while((var4 = this.aParser.PeekToken(var5)) != null) {
  58.          boolean var8 = this.LastTokenWasEOL();
  59.          if (this.IsLastEmptyOrOperator()) {
  60.             int var6 = this.CheckForTerm(var4, var5);
  61.             if (var6 == 2) {
  62.                continue;
  63.             }
  64.  
  65.             if (var6 == 1) {
  66.                break;
  67.             }
  68.  
  69.             var6 = this.CheckForConst(var4, var5);
  70.             if (var6 == 2) {
  71.                continue;
  72.             }
  73.  
  74.             if (var6 == 1) {
  75.                break;
  76.             }
  77.          }
  78.  
  79.          int var10 = this.CheckForOperator(var4, var5, var1, var2, var3, var8);
  80.          if (var10 == 3) {
  81.             this.aActNode.SetRestTermExpr(new JScriptExprTerm("(special elem-term)", this.aParser.ParseTerm(true)));
  82.          } else if (var10 != 2) {
  83.             if (var10 != 1 && var2 && !this.IsLastEmptyOrOperator()) {
  84.                this.HandleError(1022, var5);
  85.             }
  86.             break;
  87.          }
  88.       }
  89.  
  90.       if (this.aActNode instanceof JScriptExprOperator && !((JScriptExprOperator)this.aActNode).HasCorrectOperands()) {
  91.          this.HandleError(1008, var5);
  92.          this.aActNode = var7;
  93.          return null;
  94.       } else {
  95.          JScriptExprNode var11 = this.GetExprTreeRoot();
  96.          this.aActNode = var7;
  97.          return var11;
  98.       }
  99.    }
  100.  
  101.    public void DumpAll(PrintStream var1, boolean var2) {
  102.       var1.println("JScriptExprParser::DumpAll() --> ShowExprTree():");
  103.       this.ShowExprTree(var1);
  104.    }
  105.  
  106.    private void Init() {
  107.       this.aActNode = null;
  108.       this.aParser = null;
  109.       this.aErrorLog = null;
  110.    }
  111.  
  112.    private JScriptExprNode GetExprTreeRoot() {
  113.       return this.aActNode != null ? this.aActNode.GetRoot() : null;
  114.    }
  115.  
  116.    private void ShowExprTree(PrintStream var1) {
  117.       var1.println();
  118.       var1.println("SHOW EXPR. TREE:");
  119.       var1.println("================");
  120.       if (this.GetExprTreeRoot() != null) {
  121.          this.GetExprTreeRoot().ShowTotalTree(var1);
  122.       } else {
  123.          var1.println("Expression-Tree is empty !");
  124.       }
  125.  
  126.       var1.println();
  127.    }
  128.  
  129.    private void HandleError(int var1, JScriptTokenPosition var2) throws JScriptExprParserException {
  130.       JScriptExprParserException var3 = new JScriptExprParserException(var1, (String)null, var2);
  131.       if (this.aErrorLog != null) {
  132.          this.aErrorLog.AddError(var3);
  133.       } else {
  134.          throw var3;
  135.       }
  136.    }
  137.  
  138.    private JScriptExprNode RecursiveParseCall(boolean var1, boolean var2, boolean var3) throws JScriptExprParserException, JSbxExceptionBase {
  139.       JScriptExprParser var4 = new JScriptExprParser(this.aParser, this.aErrorLog);
  140.       JScriptExprNode var5 = (JScriptExprNode)var4.ParseIt(var1, var2, var3);
  141.       Object var6 = null;
  142.       return var5;
  143.    }
  144.  
  145.    private void InsertRightNode(JScriptExprNode var1) throws JScriptExprParserException {
  146.       this.aActNode.InsertRightExpr(var1);
  147.       var1.InsertParent(this.aActNode);
  148.       this.aActNode = var1;
  149.    }
  150.  
  151.    private int InsertRightNode_Check(JScriptExprNode var1, int var2, JScriptTokenPosition var3) throws JScriptExprParserException {
  152.       if (this.aActNode == null) {
  153.          this.aActNode = var1;
  154.       } else {
  155.          if (!(this.aActNode instanceof JScriptExprOperator)) {
  156.             this.HandleError(var2, var3);
  157.             return 1;
  158.          }
  159.  
  160.          this.InsertRightNode(var1);
  161.       }
  162.  
  163.       return 2;
  164.    }
  165.  
  166.    private void InsertLeftNode(JScriptExprNode var1) throws JScriptExprParserException {
  167.       var1.InsertLeftExpr(this.aActNode);
  168.       var1.InsertParent(this.aActNode.GetParent());
  169.       if (this.aActNode.GetParent() instanceof JScriptExprOperator) {
  170.          this.aActNode.GetParent().InsertRightExpr(var1);
  171.       }
  172.  
  173.       this.aActNode.InsertParent(var1);
  174.       this.aActNode = var1;
  175.    }
  176.  
  177.    private int CheckForTerm(JScriptToken var1, JScriptTokenPosition var2) throws JSbxExceptionBase {
  178.       JScriptParserTerm var4 = this.aParser.ParseTerm();
  179.       if (var4 != null) {
  180.          JScriptExprTerm var3 = new JScriptExprTerm(var1.GetString(), var4);
  181.          int var5 = this.InsertRightNode_Check(var3, 1009, var2);
  182.          return var5;
  183.       } else {
  184.          return 0;
  185.       }
  186.    }
  187.  
  188.    private int CheckForConst(JScriptToken var1, JScriptTokenPosition var2) throws JSbxExceptionBase {
  189.       if (var1.GetType() == 3) {
  190.          JScriptExprConst var4 = new JScriptExprConst(var1.GetString(), var1.GetValue());
  191.          int var3 = this.InsertRightNode_Check(var4, 1009, var2);
  192.          if (var3 == 2) {
  193.             this.aParser.NextToken(var2);
  194.          }
  195.  
  196.          return var3;
  197.       } else {
  198.          return 0;
  199.       }
  200.    }
  201.  
  202.    private int CheckForOperator(JScriptToken var1, JScriptTokenPosition var2, boolean var3, boolean var4, boolean var5, boolean var6) throws JSbxExceptionBase {
  203.       short var7 = var1.GetID();
  204.       if (var7 != 133 && var7 != 130) {
  205.          if (var1.GetType() != 4) {
  206.             return 0;
  207.          } else if (var3 && var7 == 94) {
  208.             return 1;
  209.          } else if (!var4 && var7 == 88) {
  210.             return 1;
  211.          } else if (!var6 || var7 != 92 && var7 != 96) {
  212.             var1 = this.aParser.NextToken(var2);
  213.             if (var7 == 100) {
  214.                if (!var5) {
  215.                   this.HandleError(1011, var2);
  216.                }
  217.  
  218.                return 1;
  219.             } else if (var7 == 88) {
  220.                if (!var4) {
  221.                   this.HandleError(1006, var2);
  222.                }
  223.  
  224.                return 1;
  225.             } else if (var7 == 87) {
  226.                JScriptExprSubExpr var11 = new JScriptExprSubExpr(this.RecursiveParseCall(false, true, false));
  227.                return this.InsertRightNode_Check(var11, 1010, var2);
  228.             } else {
  229.                JScriptExprOperator var8 = new JScriptExprOperator(var1);
  230.                if (this.aActNode == null) {
  231.                   if (!var8.IsValidUnaryPreOperator()) {
  232.                      this.HandleError(1013, var2);
  233.                      return 1;
  234.                   }
  235.  
  236.                   var8.SetPrecedence(1);
  237.                   this.aActNode = var8;
  238.                } else {
  239.                   if (this.aActNode instanceof JScriptExprOperator && !var8.IsValidUnaryPreOperator() && !((JScriptExprOperator)this.aActNode).IsValidUnaryPostOperator()) {
  240.                      this.HandleError(1003, var2);
  241.                      return 1;
  242.                   }
  243.  
  244.                   if (this.aActNode instanceof JScriptExprOperator && !((JScriptExprOperator)this.aActNode).IsValidUnaryPostOperator() && var8.IsValidUnaryPreOperator()) {
  245.                      var8.SetPrecedence(1);
  246.                      this.InsertRightNode(var8);
  247.                      return 2;
  248.                   }
  249.  
  250.                   while(this.aActNode.GetParent() != null && this.aActNode.GetParent() instanceof JScriptExprOperator && ((JScriptExprOperator)this.aActNode.GetParent()).HasEqualLowerPrecedenceThan(var8) && !((JScriptExprOperator)this.aActNode.GetParent()).IsConditionalOperator()) {
  251.                      this.aActNode = this.aActNode.GetParent();
  252.                   }
  253.  
  254.                   this.InsertLeftNode(var8);
  255.                   if (var7 == 113) {
  256.                      JScriptExprNode var9 = this.RecursiveParseCall(false, false, true);
  257.                      var8.InsertOptExpr(var9);
  258.                   }
  259.                }
  260.  
  261.                return 2;
  262.             }
  263.          } else {
  264.             return 1;
  265.          }
  266.       } else {
  267.          return 3;
  268.       }
  269.    }
  270.  
  271.    private boolean CheckForKeyword(JScriptToken var1, JScriptTokenPosition var2) {
  272.       return var1.GetType() == 1;
  273.    }
  274.  
  275.    private boolean CheckForSpecialChar(JScriptToken var1, JScriptTokenPosition var2) throws JScriptTokenizerException {
  276.       if (var1.GetType() == 5) {
  277.          if (var1.GetID() == 132) {
  278.             return true;
  279.          }
  280.  
  281.          var1 = this.aParser.NextToken(var2);
  282.          if (var1.GetID() != 134) {
  283.             this.HandleError(1005, var2);
  284.             return true;
  285.          }
  286.       }
  287.  
  288.       return false;
  289.    }
  290.  
  291.    private boolean CheckForDebug(JScriptToken var1, JScriptTokenPosition var2) throws JScriptTokenizerException {
  292.       if (var1.GetType() == 6) {
  293.          this.aParser.NextToken(var2);
  294.          this.HandleError(1004, var2);
  295.          return true;
  296.       } else {
  297.          return false;
  298.       }
  299.    }
  300. }
  301.