logo Thecsea.it



Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License



scolastica » esercizi » quarta superiore » php

Testo dell'esercizio

realizzare un "precompilatore" che legendo un file c realizzi un nuovo file con le seguenti caratterstiche :
- numerazione di riga
- tutte le istruzioni che prevedono l'include devono essere sostituite con il contenuto dell'include espresso da #include<nome>
- eliminare tutte le righe commentate, presupponendo che i commenti siano messi in righe dedicate
- eliminare le righe vuote

usare la funzione substr, fgets, fputs, explode, strlen

mostra soluzione

001<?php
002/*
003CLAUDIO CARDINALE 4AI
004realizzare un "precompilatore" che legendo un file c realizzi un nuovo file con le seguenti caratterstiche :
005 - numerazione di riga
006 - tutte le istruzioni che prevedono l'include devono essere sostituite con il contenuto dell'include espresso da #include<nome>
007 - eliminare tutte le righe commentate, presupponendo che i commenti siano messi in righe dedicate
008 - eliminare le righe vuote
009  
010usare la funzione substr, fgets, fputs, explode, strlen
011*/
012//parametri configurabili
013$f_name = "file.c"; //file da leggere
014$riga = 1; //riga da cui iniziare il conteggio
015 
016$f1 = fopen($f_name,"r") or die("impossibile aprire il file\n");
017$f2 = fopen("new_".$f_name,"w") or die("impossibile creare il file\n");
018while(!feof($f1))
019    fputs($f2,leggi($f1));
020fclose($f1);
021fclose($f2);
022 
023function leggi($file){
024    //dichiarazioni
025    global $riga;
026     
027    //acquisizione riga
028    $stringa = fgets($file);
029     
030    //eliminazione riga vuota
031    if($stringa == "" || $stringa == "\n")
032        return;
033     
034    //eliminazion riga commentata
035    if(commento($stringa))
036        return;
037     
038    //sostituzione include
039    if(($str = f_include($stringa))!="")
040        return $str;
041     
042    //inserimento numero di riga
043    $stringa = $riga."\t".$stringa;
044    $riga++;
045     
046    //ritorno
047    return $stringa;
048}
049 
050//controllo se la riga e` un commento
051function commento($stringa){
052    //dichiarazioni e inizializzazioni
053    static $commento_multiriga = false;
054    $ritorno = false;
055     
056    //calcoli
057    if(cerca($stringa, "/*")){
058        $commento_multiriga = true;
059        $ritorno = true;
060    }
061     
062    if(cerca($stringa, "//"))
063        $ritorno = true;
064     
065    if($commento_multiriga && cerca($stringa, "*/")){
066        $commento_multiriga = false;
067        $ritorno = true;
068    }
069     
070    if($commento_multiriga == true)
071        $ritorno = true;
072     
073    //ritorno
074    return $ritorno;
075}
076 
077//ricerco un elemento ritornando o true o false
078function cerca($stringa, $ele){
079    if(count(explode($ele,$stringa))>1)
080        return true;
081    return false;
082}
083 
084//includo i file
085function f_include($stringa){
086    global $riga;
087     
088    //recupero il nome dell'include
089    $stringa = explode("<",$stringa);
090    if(count($stringa)!=2 || cerca($stringa[0], "#include")===false)
091        return "";
092    $stringa = explode(">",$stringa[1]);
093    $stringa = $stringa[0];
094     
095    //controllo se e` presente l'include
096    if($stringa == "")
097        return "";
098     
099    //lettura
100    $f = fopen("/usr/include/".$stringa,"r") or die("impossibile aprire il file di header\n");
101    $stringa = "";
102    while(!feof($f)){
103        if(($str = fgets($f))!=""){
104            $stringa .= $riga."\t".$str;
105            $riga++;
106        }
107    }
108    fclose($f);
109     
110    //ritorno
111    return $stringa;
112}
113?>

torna



Copyright © 2004-2025 thecsea.it (Claudio Cardinale - cardi@thecsea.it)! Tutti i diritti riservati. - contattaci