Archief - [PROG][C] Probleem i.v.m. pseudo_2_c vertaler

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Skeletonlord

Legacy Member
Ik ben bezig met het schrijven aan een programma waar je dmv het schrijven van pseudocode een werkend c-programma krijgt.
Het inlezen gebeurt in een c-werkblad (in den exe :p ) en wordt dan geschreven naar een tekstbestand.
Ik open dit bestand weer in de functie Converteer waar ik de pseudo code wil omzetten in C taal.De variabelen die gedeclareerd zijn,zijn al gelezen en omgezet in een type naar keuze v/d gebruiker.
Ook zijn alle headers als aangebracht zoals <stdio.h>.... enz.
Het probleem zit het hem in het converteren zelf,ik heb alle nodige tekens en pseudo woorden in een array gestoken :

Code:
char tekens[12][2]={"=","-","*","+","/","<",">","%","\(","\)","\""};
  char func[13][8]={"<>","while", "do", "enddo", "repeat", "until", "write", "read", "if", "then", "else", "endif", "case", "endcase"};

Hij gaat de file accessen en dan iedere keer tot een ' '(spatie) lezen en dan deze code vergelijken met 1 van de tabellen en dan daarna omzetten in c-taal.De c-taal syntax wil ik ook in een tabel zetten zodat als met pseudo vindt,dat men enkel maar c_taal hoeft af te drukken

Mijn vraag was dus :
Is dit de efficientste manier ?
Zoneen,mss enig idee ?

Dank bij voorbaat,
Skeletonlord

Storm_Rider

Legacy Member
Efficienste en meest algemene manier imo would be:
* Syntax in xml steken en xml file parsen.
* Alle keywords in een std::map<std::string,std::string> steken zodat opzoeken en vertalen heel simpel en snel wordt.

Voor het inlezen van de pseudocode file gebruik je best een std::ifstream.

Skeletonlord

Legacy Member
::zucht:: en ik maar denken dat er een simpelere manier bestond =(
Ik ben eigenlijk totaal onbekend met XML en gevorderde functies zijn nog chinees voor me

killgore

Legacy Member
StormRider: tis C bij mijn weten, geen c++

in c++ kan et pretty extreem easy met string-type ;).

Storm_Rider

Legacy Member
Je kan het wel simpeler oplossen door gewoon alle translaties in de code zelf in te vullen, bv:
Code:
typedef std::map<std::string,std::string>  TStringMap;
TStringMap TranslationMap;
TranslationMap["pseudo"] = "c-keyword"
...
Je kan ook steeds alle vertalingen opslaan in een gewoon tekst bestand en ze dan gewoon zo inlezen via ifstream, je m
Code:
oet niet echt xml gebruiken ervoor.

om ze dan op te zoeken doe je gewoon:
Code:
std::string Code;
TStringMap::iterator I = TranslationMap.find("pseudo");
if (I!=TranslationMap.end())
{
   // pseudocode gevonden
   Code = I->second; 
}
else
{
   // Niet gevonden, fout in pseudo code?
}

Hope this is of any help to you.

Storm_Rider

Legacy Member
killgore zei:
StormRider: tis C bij mijn weten, geen c++

in c++ kan et pretty extreem easy met string-type ;).

Oeps, my bad, verkeerd gelezen :)

In dat geval zal je je moeten behelpen met scanf en zelf een map moeten schrijven :)

killgore

Legacy Member
Storm_Rider zei:
Oeps, my bad, verkeerd gelezen :)

In dat geval zal je je moeten behelpen met scanf en zelf een map moeten schrijven :)
mssch is eigen map overdreven, ma ik zou idd iets algemener schrijven dat herbruikbaar is. ge verliest mssch wat optimalisatie, ma denk niet dat dat zo zwaar nodig is.

Skeletonlord

Legacy Member
Storm_Rider zei:
Oeps, my bad, verkeerd gelezen :)

In dat geval zal je je moeten behelpen met scanf en zelf een map moeten schrijven :)

bedoel je geen Fscanf ?

wlibaers

Legacy Member
Skeletonlord zei:
Hij gaat de file accessen en dan iedere keer tot een ' '(spatie) lezen en dan deze code vergelijken met 1 van de tabellen en dan daarna omzetten in c-taal.De c-taal syntax wil ik ook in een tabel zetten zodat als met pseudo vindt,dat men enkel maar c_taal hoeft af te drukken


Dus gewoon stringsubstitutie, zonder veranderingen in structuur of volgorde? Moet werken, ja.

Mijn vraag was dus :
Is dit de efficientste manier ?

Is de pseudocode zo gigantisch groot dat je je daarover zorgen moet maken? Of moet je het op je rekenmachine kunnen uitvoeren of zo? Tenzij je heel grote bestanden wil bewerken kan je waarschijnlijk aanvaardbare efficiëntie bereiken met Perl, Python of Tcl, en het zal je minder werk kosten.

killgore

Legacy Member
wlibaers zei:
Is de pseudocode zo gigantisch groot dat je je daarover zorgen moet maken? Of moet je het op je rekenmachine kunnen uitvoeren of zo? Tenzij je heel grote bestanden wil bewerken kan je waarschijnlijk aanvaardbare efficiëntie bereiken met Perl, Python of Tcl, en het zal je minder werk kosten.
n/o, ma quit de bs rond talen, hij vroeg iets voor toepassing in C, zeg hem niet dat em nu een ander taal moet gaan gebruiken, ma geef gvd antwoord op zijn vraag. Der zijn al genoeg threads geweest over het nut van elke taal.
De kans is btw zeeer groot dat ze C gewoon moeten gebruiken voor die opdracht.

Ma ergens heb je wel punt: maak herbruikbare en deftigere code :). Minder effciënt, maar beter.

Hale

Legacy Member
je moet wel opletten dat je lexicale analyse ( want dat is wat je aan het doen bent: je bent de allereerste fase uit het compile process aan het uitvoeren ) robuust genoeg is om alle correcte pseudo code om te kunnen zetten.

Als je zoals nu inleest van spatie tot spatie ga je in sommige (triviale) gevallen in de problemen komen : bv. while(x==5)
zal je een probleem geven omdat er nergens spaties staan, terwijl je dit moeilijk als foutieve invoer kan gaan beschouwen..

normaal gezien gebruikt de compiler tijdens de lexicale analyse reguliere expressies om keywords,identifiers en dergelijke te gaan herkennen en juist te benoemen.
Ik heb wel geen idee of C functies aanbiedt om reguliere expressies te gebruiken.
Zelf reguliere expressies gaan implementeren ( adhv (niet-)deterministische finite automata ) is misschien beetje te veel werk/overkill.

wlibaers

Legacy Member
killgore zei:
n/o, ma quit de bs rond talen, hij vroeg iets voor toepassing in C, zeg hem niet dat em nu een ander taal moet gaan gebruiken, ma geef gvd antwoord op zijn vraag. Der zijn al genoeg threads geweest over het nut van elke taal.
De kans is btw zeeer groot dat ze C gewoon moeten gebruiken voor die opdracht.

Ma ergens heb je wel punt: maak herbruikbare en deftigere code :). Minder effciënt, maar beter.

Tja, hangt ervan af of het huiswerk is, of dat het gewoon de bedoeling is zo snel mogelijk de functionaliteit te hebben.

Als het in C moet denk ik niet dat efficiëntie een probleem zal zijn. Als je echt uitgebreide bibliotheken van substituties hebt kan je eventueel hashing gaan gebruiken of andere structuren om snel te zoeken, maar als de lijsten zo kort zijn is het niet echt de moeite. Gewoon zo simpel mogelijk, tenzij het een huiswerkoefening over optimalisatie is of zo.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan