Пример #1
0
// Parse a postfix expr.
//
//    postfix-expr ::= applicaiton-expr
Tree*
parse_postfix_expr(Parser& p) {
  if (Tree* t1 = parse_primary_expr(p)) {
    while (t1) {
      if (Tree* t2 = parse_dot_expr(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_application_expr(p, t1)) 
        t1 = t2;
      else if (Tree* t2 = parse_and_expr(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_or_expr(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_eq_comp_expr(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_less_expr(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_union(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_intersect(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_except(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_join(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_as(p, t1))
        t1 = t2;
      else 
        break;
    }
    return t1;
  }
  return parse_primary_expr(p);
}
Пример #2
0
// Parse a mv expression.
// mv-expr ::= 'mv' string-expr string-expr
Tree*
parse_mv(Parser& p) {
  if (const Token* k = parse::accept(p, mv_tok)) {
    if (Tree* t = parse_primary_expr(p)) 
    if (Tree* t1 = parse_primary_expr(p)) 
          return new Mv_tree(k, t, t1);
    else 
      parse::parse_error(p) << "expected 'string-expr' after 'mv'";
    }  
  return nullptr;
}
Пример #3
0
// Parse a postfix expr.
//
//    postfix-expr ::= applicaiton-expr
Tree*
parse_postfix_expr(Parser& p) {
  if (Tree* t1 = parse_primary_expr(p)) {
    while (t1) {
      if (Tree* t2 = parse_dot_expr(p, t1))
        t1 = t2;
      else if (Tree* t2 = parse_application_expr(p, t1)) 
        t1 = t2;
      else 
        break;
    }
    return t1;
  }
  return parse_primary_expr(p);
}
Пример #4
0
// Parse a dot expression.
//
//    dot-expr ::= postfix-expr '.' primary-expr
Tree*
parse_dot_expr(Parser& p, Tree* t1) {
  if (parse::accept(p, dot_tok))
    if (Tree* t2 = parse_primary_expr(p))
      return new Dot_tree(t1, t2);
    else
      parse::parse_error(p) << "expected 'primary-expr' after '.'";
  return nullptr;
}
Пример #5
0
// Parse a cd expression.
// cd-expr ::= 'cd' string-expr
Tree*
parse_cd(Parser& p) {
  if (const Token* k = parse::accept(p, cd_tok)) {
    if (Tree* t = parse_primary_expr(p)) 
          return new Cd_tree(k, t);
    else 
      parse::parse_error(p) << "expected 'string-expr' after 'cd'";
    }  
  return nullptr;
}
Пример #6
0
// Parse a mkdir expression.
// mkdir-expr ::= 'mkdir' string-expr
Tree*
parse_mkdir(Parser& p) {
  if (const Token* k = parse::accept(p, mkdir_tok)) {
  	/* if (parse::expect(p, equal_tok)){
          parse::parse_error(p) << "expected 'string' after";  	 	
  	 }
    else{ */
    	if (Tree* t = parse_primary_expr(p)) 
          return new Mkdir_tree(k, t);
    else 
      parse::parse_error(p) << "expected 'string-expr' after 'mkdir'";
      }  //}
  return nullptr;
}
Пример #7
0
// unary-expr ::= - unary expr
//                + unary expr
//                ! unary expr
//                primary expr
Expr*
parse_unary_expr(Parser& p, Token_stream& ts)
{
  if(ts.next()) {
    switch (ts.next()->kind()) {
      // negative
      case minus_tok: return parse_neg(p, ts);
      case plus_tok: return parse_pos(p, ts);
      case bang_tok: return parse_not(p, ts);
      default:
        return parse_primary_expr(p, ts);
    }
  }

  return nullptr;
}
Пример #8
0
static int
parse_unary_expr(int need_eval, cfg_cond_value_t *prv)
{
  return parse_primary_expr(need_eval, prv);
}
Пример #9
0
// Parse an application expr.
//
//    application-expr ::= postfix-expr primary-expr
Tree*
parse_application_expr(Parser& p, Tree* t1) {
  if (Tree* t2 = parse_primary_expr(p))
    return new App_tree(t1, t2);
  return nullptr;
}