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 <
010
17.06.2003, 22:53 Uhr
Pablo
Supertux
(Operator)


Naja, um ehrlich zu sein, komische Aufgabe, aber eine echte Herausforderung, wenn man keinen Parser gemacht hab. Ich hab zwar einen kleinen Mathe-Parser gemacht, der im C++ Buch (kap 6) von Stroustrup enthalten ist, und ich habe ihn erweitert. würde gerne mitmachen, aber da ich ziemlich "newbee" in Parsering bin, würde mir sehr viel Zeit kosten, und Aufgaben für die Uni habe ich schon mehr als genug.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
18.06.2003, 09:19 Uhr
arkantos



@heiko:

Wie wärs mit "Der Held von Atlantis"...
--
schöne grüße,
arkantos
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
18.06.2003, 10:29 Uhr
virtual
Sexiest Bit alive
(Operator)


Da es nun ein Perl Forum gibt und das hier nur noch eine Rätselecke ist, möchte ich Euch eine Perllösung nicht vorenthalten:

Code:
@kw= qw(    
    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
);

while(<STDIN>)
{
    next if /^\s*#/;                    # Ignore preprocessor directives
    s+\\.++g;                           # Remove quoted characters
    s+\"[^\"]*\"++g;                    # Remove strings
    s+\'[^\']*\'++g;                    # Remove character literals
    s+//.*++;                           # Remove C++ style comments
    $code .= $_;
}
$_ = $code;
s+\/\*.*?\*\/++gs;                      # Remove C style comments
s+[^a-zA-Z0-9_]+ +gs;                   # Only alpha numeric characters are interesting

@tokens = split(/\s+/, $_);             # List of all tokens
@tokens = grep ! /^[0-9]/, @tokens;     # We are not interested in numbers
foreach  $token (@tokens)
{
    print "$token\n" unless grep /^$token$/, @kw;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 18.06.2003 um 10:42 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
18.06.2003, 11:45 Uhr
~0xdeadbeef
Gast


Igitt, Perl...wie wärs denn mit einem sed/fgrep-Skript? Sowas in der Art, auch wenn das gerade nur so hingekladdet ist:

Code:
sed -e 's/[!A-Za-z]/\n/g' | fgrep -v 'hier liste der Symbole' | grep -v '^$'

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
18.06.2003, 12:18 Uhr
Bruder Leif
dances with systems
(Operator)


Hm, wenn jetzt jede Sprache erlaubt ist, halt ich mal die Python-Fackel hoch:


Code:
import re
import string

################################################################################

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")

################################################################################

def NotNum(x):
   if x == "" or (x[0] >= "0" and x[0] <= "9"):
      return 0
   return 1

################################################################################

def NotKeyword(x):
   return not (x in keywords)

################################################################################

Rest = ""
r1 = re.compile(r"\".*?\"")   # Match: Stringkonstanten
r2 = re.compile(r"\'.\'")     # Match: Zeichenkonstanten
r3 = re.compile(r"//.*")      # Match: C++-Kommentare

while 1:
   try:
      s = string.strip(raw_input())

      # Leerzeilen und Präprozessordirektiven überlesen
      if s == "" or s[0] == "#":
         continue

      # String- und Zeichenkonstanten sowie C++-Kommentare entfernen
      s = r3.sub("", r2.sub("", r1.sub("", s)))

      Rest += s

   except EOFError:
      break

Rest = re.sub(r"/\*.*\*/", "", Rest)        # C-Kommentare entfernen
Tokens = re.split(r"[^a-zA-Z0-9_]+", Rest)  # In einzelne Tokens aufteilen
Tokens = filter(NotNum, Tokens)             # Zahlen entfernen
Tokens = filter(NotKeyword, Tokens)         # Keywords entfernen

print Tokens



(wie wärs mit einem Python-Teil im Forum? ;-))
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 18.06.2003 um 12:19 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
18.06.2003, 12:23 Uhr
~0xdeadbeef
Gast


Gute Idee, Python wollte ich schon immer mal lernen.
 
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: