pike.git / lib / modules / Tools.pmod / AutoDoc.pmod / PikeParser.pike

version» Context lines:

pike.git/lib/modules/Tools.pmod/AutoDoc.pmod/PikeParser.pike:348:    }    return m;   }      //! Parse an array type.   ArrayType parseArray() {    eat("array");    ArrayType a = ArrayType();    if (peekToken() == "(") {    readToken(); -  if (lookAhead(1) == ":") { -  a->length = (int)readToken(); -  if (eat((<":",")">))==")") { -  return a; +  Type t; +  if ((peekToken()[0] >= '0') && (peekToken()[0] <= '9')) { +  t = IntType(); +  if ((lookAhead(1) == ":") && +  !has_suffix(peekToken(), "bit") && +  !has_suffix(peekToken(), "bits")) { +  // Integer literal followed by a ':'. +  t->min = t->max = eatLiteral(); +  } else { +  lowParseRange(t);    } -  +  } else if (peekToken() == "..") { +  t = IntType(); +  lowParseRange(t); +  } else if (peekToken() != ":") { +  t = parseOrType();    } -  +  if (peekToken() == ":") { +  a->length = t; +  eat(":"); +  if (peekToken() != ")") {    a->valuetype = parseOrType(); -  +  } +  } else { +  a->valuetype = t; +  }    eat(")");    }    return a;   }      //! Parse a multiset type.   MultisetType parseMultiset() {    eat("multiset");    MultisetType m = MultisetType();    if (peekToken() == "(") {
pike.git/lib/modules/Tools.pmod/AutoDoc.pmod/PikeParser.pike:404:    if (peekToken() == ":") {    readToken();    f->returntype = parseOrType() || parseError("expected return type");    }    eat(")");    }    return f;   }       - StringType|IntType parseRange(StringType|IntType s) + StringType|IntType lowParseRange(StringType|IntType s)   {    string tk; -  if (peekToken() == "(") { -  readToken(); +     switch (peekToken()) {    case "zero":    eat("zero");    s->min = s->max = "0"; -  eat(")"); +     return s;    case "..":    break;    default:    s->min = eatLiteral();    if(sscanf(s->min, "%sbit", s->min) ||    (<"bit","bits">)[(tk = peekToken())] )    {    if (tk) eat(tk); -  eat(")"); +     s->max = (string)((1<<(int)s->min)-1);    s->min = "0";    return s;    }    }       eat("..");    -  if (peekToken() != ")") +  if (!(<")", ",", ":">)[peekToken()])    s->max = eatLiteral();    -  +  return s; + } +  + StringType|IntType parseRange(StringType|IntType s) + { +  string tk; +  if (peekToken() == "(") { +  readToken(); +  +  lowParseRange(s); +     eat(")");    }    return s;   }      //! Parse an integer type.   IntType parseInt() {    eat("int");    return parseRange(IntType());   }