Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 30 Virtualrätsel - Ein simpler parser

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
17.06.2003, 12:55 Uhr
virtual
Sexiest Bit alive
(Operator)


Damit ihr für die folgende Aufgabe nicht zuviel Fleißarbeit machen müsst, hier
schon mal der fertige langweilige Teil:


C++:
const char* cpp_keywords[] = {
    "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case",
    "catch", "char", "class", "compl", "const", "const_cast", "continue",
    "default", "delete", "do", "double", "dynamic_cast", "else", "enum",
    "explicit", "export", "extern", "false", "float", "for", "friend", "goto",
    "if", "inline", "int", "long", "mutable", "namespace", "new", "not",
    "not_eq", "operator", "or", "or_eq", "private", "protected", "public",
    "register", "reinterpret_cast", "return", "short", "switch", "template",
    "this", "throw", "true", "try", "typedef", "typeid", "typename", "union",
    "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while",
    "xor", "xor_eq"
};


Obiges Array enthält alle Keywords der Sprache C++.
Zu schreiben ist ein Programm, welches als Eingabe einen C++ Source erwartet und dann alle Bezeichner (also Typnamen, Variablen namen und Funktionsnamen) ausgibt, die iM Code enthalten sind.
Desweiteren sollen alle Präprozessor anweisungen und String rausgefilter werden.

C++:
#include <iostream>
#include <cstdlib>
int main()
{
    std::cout<<"Hallo Forum!"<<std::endl;
    return EXIT_SUCCESS;
}


Sollte also zu dieser Ausgabe führen (ggf. sortiert und duplicate entfernt):

Code:
main
std
cout
std
endl
EXIT_SUCCESS


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.06.2003, 14:33 Uhr
~dönerlecker
Gast


komische aufgabe...
hat doch keinen sinn.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.06.2003, 15:08 Uhr
virtual
Sexiest Bit alive
(Operator)


Du kennst das Folgerästel ja noch nicht
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.06.2003, 15:11 Uhr
Bruder Leif
dances with systems
(Operator)


Laß mich raten: 31. virtual-Rätsel: Ein einfacher Codegenerator...
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.06.2003, 15:17 Uhr
~0xdeadbeef
Gast


Das wär ja glatt was für yacc oder bison...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.06.2003, 15:21 Uhr
~dönerlecker
Gast


moment, da muss ich
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.06.2003, 17:23 Uhr
virtual
Sexiest Bit alive
(Operator)


@beefy
Auf yacc kannst Du verzichten:
---------------------------------------------------------------------
%{
char string_start;
%}

%s COMMENT
%s STRING

%%

<INITIAL>["'] { string_start = *yytext; BEGIN(STRING); }
<INITIAL>\/\/[^\n]*\n { /* Eat C++ Style comments */ }
<INITIAL>"/*" { BEGIN(COMMENT); }
<INITIAL>[[:alpha:]_][[:alnum:]_]* {
static const char* cpp_keywords[] = {
"and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case",
"catch", "char", "class", "compl", "const", "const_cast", "continue",
"default", "delete", "do", "double", "dynamic_cast", "else", "enum",
"explicit", "export", "extern", "false", "float", "for", "friend", "goto",
"if", "inline", "int", "long", "mutable", "namespace", "new", "not",
"not_eq", "operator", "or", "or_eq", "private", "protected", "public",
"register", "reinterpret_cast", "return", "short", "switch", "template",
"this", "throw", "true", "try", "typedef", "typeid", "typename", "union",
"unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while",
"xor", "xor_eq", NULL };
int i;
for(i=0; cpp_keywords[ i ]; ++i)
if (strcmp(cpp_keywords[ i ], yytext)==0)
break;
if (!cpp_keywords[ i ]) printf("%s\n", yytext);
}
<COMMENT>"*/" { BEGIN(INITIAL); }
<STRING>['"] { if (*yytext==string_start) { BEGIN(INITIAL); } }
<STRING>\\ { input(); }
. { }
\n { }

%%

int
yywrap()
{
return 1;
}

int
main()
{
yyin = stdin;
yylex();
return 0;
}
---------------------------------------------------------------------

Edit: Das Forum kommt nicht mit flex Scripten klar, deshalb die blöde (fehlende) Formatierung.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 17.06.2003 um 17:25 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.06.2003, 17:36 Uhr
arkantos



Meine Lösung ist zwar n bisschen aufwendig, aber sie funktioniert:


C++:
#include <stdio.h>
#include <string.h>

main(int argc, char *argv[])
{
const char* cpp_keywords[] = {
    "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case",
    "catch", "char", "class", "compl", "const", "const_cast", "continue",
    "default", "delete", "do", "double", "dynamic_cast", "else", "enum",
    "explicit", "export", "extern", "false", "float", "for", "friend", "goto",
    "if", "inline", "int", "long", "mutable", "namespace", "new", "not",
    "not_eq", "operator", "or", "or_eq", "private", "protected", "public",
    "register", "reinterpret_cast", "return", "short", "switch", "template",
    "this", "throw", "true", "try", "typedef", "typeid", "typename", "union",
    "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while",
    "xor", "xor_eq"
};

FILE *fp, *poi;
char wort[30];
int i, j;
char line1;

fp=fopen(argv[1],  "r");
poi=fopen("ausgabe", "w+");

if(fp==NULL)
{printf("fp ist NULL\n"); exit(11);}

/*Sonderzeichen, Strings, includes werden rausgefischt*/
while(feof(fp)==0)
{
line1=fgetc(fp);

   if(line1=='"')
      while(1)
      {
      line1=fgetc(fp);
      if(line1=='"')
         break;
      }

   if(line1=='#')
      while(1)
      {
      line1=fgetc(fp);
      if(line1=='\n')
     break;
      }

   if(toupper(line1)>=0x41 && toupper(line1)<=0x5A)
      {fputc(line1, poi);}
      
   else
   {
   if(line1=='\n')
       fputc(line1, poi);
   else if(line1=='_')
          fputc('_', poi);
  
   else
       fputc(' ', poi);
   }

}

fclose(fp);
rewind(poi);

/*Schlüsselwörter werden rausgefischt*/

while(feof(poi)==0)
{
fscanf(poi, "%s", wort);

   for(i=0; i<69; i++)
   {
   if(strcmp(wort, cpp_keywords[i])==0)
      {break;}
   else;
   }
  
   if(i==69)      
      printf("%s\n", wort);

}


fclose(poi);
    
}




--
schöne grüße,
arkantos

Dieser Post wurde am 17.06.2003 um 17:37 Uhr von arkantos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.06.2003, 17:40 Uhr
arkantos



Krieg ich jetzt auch nen Zusatznamen, der dann unter der Kennung steht?
Ich war auch immer ganz brav
--
schöne grüße,
arkantos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.06.2003, 18:02 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Wie willst du dich denn nennen?
Der grosse Parser
Parzival
Parsermaniac
Parserator
...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: