Translator z C na język powłoki linuxa

0

Witam!
Byłby ktoś w stanie pomóc mi w pracy nad projektem programu pracującego w Shellu, który tłumaczy plik zapisany w C na plik zapisany w Shellu?
Zacząłem go już robić lecz część mi nie działa więc jeśli ktoś byłby w stanie pomóc nawet szczątkowo to byłbym wdzięczny ;)

#!/bin/sh 
 
echo "Wprowadz nazwe pliku do przekonwertowania "
read nazwa
 
echo "Konwertowanie pliku $nazwa do pliku $nazwa.sh"
while read linia
do
{
   if [ ! "$linia" ]  
   then              
    continue      
   else  
    if  echo "$linia" | grep -qe "#include"  
    then                            
        echo "#!/bin/sh" >$nazwa.sh
        continue
   
 
    elif  echo "$linia" | grep -qe "}else{"  
    then                            
        temp=$( echo "$linia" | sed -e 's/}else{/else/' )
           
    elif  echo "$linia" | grep -wq "else"  
    then                            
        temp=$( echo "$linia" | sed -e 's/else/else/' )
           
    elif  echo "$linia" | grep -wq "elseif"  
    then                            
        temp=$( echo "$linia" | sed -e 's/elseif/elif/' -e 's/(/\[/' -e 's/)/\]\nthen/' )
           
    elif  echo "$linia" | grep -wq "else if"  
    then                            
        temp=$( echo "$linia" | sed -e 's/else if/elif/' -e 's/(/\[/' -e 's/)/\]\nthen/' )
           
 
    elif  echo "$linia" | grep -wq "for"  
    then                            
        temp=$( echo "Polecenie for w takiej formie mozna wykonac dopiero w bashu" )
 
 
           
 
    elif  echo "$linia" | grep -wq "switch"  
    then                            
        temp=$( echo "$linia" | sed -e 's/switch (/case/' -e 's/){/in/' )
           
   
    elif  echo "$linia" | grep -wq "printf"  
    then                            
        temp=$( echo "$linia" | sed -e 's/printf/echo /' -e 's/(//' -e 's/)//' -e 's/;//' -e 's/,%//' )
           
 
    elif  echo "$linia" | grep "scanf*"  
    then                            
        temp=$( echo "$linia " | sed -e 's/scanf/read /' -e 's/"//' )
 
    elif  echo "$linia" | grep -q '\*'  
    then                            
        temp=$( echo "$linia " | sed -e 's/\/\*/#/g' -e 's/\*\///g')
           
 
    elif  echo "$linia" | grep -wq "while"  
    then                            
        temp=$( echo "$linia" | sed -e 's/)/\)\ndo/' -e 's/)/\]\ndone/' )
           
    elif  echo "$linia" | grep -qe "\=\="  
    then                            
        temp=$( echo "$linia" | sed -e 's/==/\-eq/' )
 
    elif  echo "$linia" | grep -wq "default"  
    then                            
        temp=$( echo "$linia" | sed -e 's/default/\*/' -e 's/:/\)/' )
           
    elif  echo "$linia" | grep -wq "return"  
    then                            
        continue
    elif  echo "$linia" | grep -wq "main"  
    then                            
        continue
    elif  echo "$linia" | grep -qe "\/\/"  
    then                            
        temp=$( echo "$linia" | sed -e 's/\/\//\#/' )
 
    elif  echo "$linia" | grep -qe "\<"  
    then                            
        temp=$( echo "$linia" | sed -e 's/</\ -lt /' -e 's/)/\] \n then/' -e 's/\(\)/\[\]/' )
            linia="$temp"
   
    elif  echo "$linia" | grep -qe "\<\="  
    then                            
        temp=$( echo "$linia" | sed -e 's/\<\=/\-le/' )
           
    elif  echo "$linia" | grep -qe "\>\="  
    then                            
        temp=$( echo "$linia" | sed -e 's/>=/\-ge/' )
           
    elif  echo "$linia" | grep -qe "\;"  
    then                            
        temp=$( echo "$linia" | sed -e 's/;//' )
           
    elif  echo "$linia" | grep -qe "\{"  
    then                            
        continue
    elif  echo "$linia" | grep -qe "\}"  
    then                            
        continue  
   
    elif  echo "$linia" | grep -qe "\} \>"  
    then                            
        temp=$( echo "$linia" | sed -e 's/} >/done \>/' )
           
   
    elif  echo "$linia" | grep -wq "case"  
    then                            
        temp=$( echo "$linia" | sed -e 's/case//' -e 's/:/\)/'  )
           
    elif  echo "$linia" | grep -qe "\>"  
    then                            
        temp=$( echo "$linia" | sed -e 's/>/\-gt/' )
           
 
    elif  echo "$linia" | grep -q "\!\="  
    then                            
        temp=$( echo "$linia" | sed -e 's/!=/\-ne/' )
   
    elif  echo "$linia" | grep -wq "break"  
    then                            
        temp=$( echo "$linia" | sed -e 's/break/\;\;/' )
 
    else
    temp=$( echo "Ta linia nie moze zostac przetlumaczona $linia" )  
   
 
           
    fi
fi
 
echo "$temp" >> $nazwa.sh
}
done < $nazwa
 
 
echo "Podaj prawa dostepu dla pliku(numerycznie) $nazwa.sh:"
read dostep
chmod $dostep $nazwa.sh
echo "Przetlumaczony plik:"
cat $nazwa.sh

0

Co chcesz osiągnąć?
Jeżeli to ma działać dla jakiegoś jednego określonego przypadku to go nam podaj.
Jeżeli ma to być uniwersalny "translator c->bash" to czekają Cię lata pracy.
Przykładowo, jak chcesz reagować na funkcje bibliotek C?
Owszem, część z nich ma swoje odpowiedniki w postaci programów bash. Co z pozostałymi?

0

w drugą stronę byłoby łatwiej... bison i flex.

2

Piękne. Aż się oplułem piwem bezalkoholowym.
Pomysł ciekawy, ale zupełnie nie da się tego zrobić podejściem jakie zastosowałeś.

Najprościej, niestety będzie tak :

#!/bin/sh

echo "Wprowadz nazwe pliku do przekonwertowania "
read nazwa
gcc $nazwa

echo "#!/bin/sh" >$nazwa.sh
echo "./a.out" >>$nazwa.sh

Ale chyba nie tego chciałeś. :-)
Inne metody to, jak wyżej wspomniano, długie miesiące pracy.

0

To już kolejny wątek tego typu w tym roku.
Tłumaczenie programów na język powłoki

0

Proponuje zamiast C użyć jakiegoś lispa, napisanie prostego translatora/kompilatora z lispa na bash powinno być stosunkowo proste o ile już ktoś gotowca nie zrobił, ale zadaj sobie pytanie po co to robisz i co chcesz osiągnąć. (to mogłoby być przydatne https://github.com/kanaka/mal/tree/master/bash ale zakładam, że nie będziesz wiedzieć jak z tego skorzystać)

0

C jest nieprzekładalne na większość języków powstałych później (czy bardziej bezpieczne). Bywały już nagłośnione w społeczności transatory na Javę. Jak się weszło w szczegóły to tłumaczyły drobny podzbiór języka i szczególnie przygotowane fragmenty.

Jak przetłumaczysz


char * s;
....
fun(s+5);

0
AnyKtokolwiek napisał(a):

C jest nieprzekładalne na większość języków powstałych później (czy bardziej bezpieczne). Bywały już nagłośnione w społeczności transatory na Javę. Jak się weszło w szczegóły to tłumaczyły drobny podzbiór języka i szczególnie przygotowane fragmenty.

Jak przetłumaczysz


char * s;
....
fun(s+5);

No ale ja nie chce zrobić bezbłędnego tłumacza tylko by program byłby w stanie przetłumaczyć parę komend np pętle i warunki.

1
Maras1910 napisał(a):

No ale ja nie chce zrobić bezbłędnego tłumacza tylko by program byłby w stanie przetłumaczyć parę komend np pętle i warunki.

Czyli bardziej php chcesz przetłumaczyć ... kiedyś widziałem CV i oceniałem kandydata. Dał sobie znajomość C, bo znał PHP a klamerki są takie same ...

0
AnyKtokolwiek napisał(a):
Maras1910 napisał(a):

No ale ja nie chce zrobić bezbłędnego tłumacza tylko by program byłby w stanie przetłumaczyć parę komend np pętle i warunki.

Czyli bardziej php chcesz przetłumaczyć ... kiedyś widziałem CV i oceniałem kandydata. Dał sobie znajomość C, bo znał PHP a klamerki są takie same ...
Czemu niby PHP? Nie rozumiem do czego Pan zmierza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1