From:Christian Lackas
Date:31.8.01 11:23
Subject:Re: I5: Lexxer Error: Unknown token '(Stellenangebot:)' in '(Stellenangebot:)' !
Reply-To:<imperia-users@imperia.de>
References:
  • 31.8.01 10:17 Senol Tas
    [IMPERIA] I5: Lexxer Error: Unknown token '(Stellenangebot:)' in '(Stellenangebot:)' !
  • Attachments:[Source] unknown-1.pgp (application/pgp-signature)
    * Senol Tas <senol.tas@mediatrend-web.de> [010831 10:16]:
    
    Hallo zusammen,
    
    > hat jemand von euch schon diesen fehler gehabt?
    > das kommt immer wenn man in ein normales input feld etwas schreibt.
    > 	>> Lexxer Error: Unknown token '(Stellenangebot:)' in '(Stellenangebot:)' !
    
    Rainer hat ja schon auf
        http://www.lackas.net/imp/ma/iu/200108/PzaQyU96eRSgVZue.html
    verwiesen. Weiterhin lesenswert:
        http://www.lackas.net/imp/ma/in/All/STZL8ItI50TWTnjo.html
    
    Es gibt bei Verwendung von InterShopFX zwei Klassen von Fehlermeldungen:
    Grammar und Lexxer.
    
    Die ersten zeigen Fehler in der Grammatik an. Also z.B. eine
    geschlossene Klammer, zu der der Parser gar keine oeffnende Gefunden
    hat.
        #IF ("foo"))
        #ENDIF
    
        => Grammar: unmatched closed brace found in '("foo"))' 
    
    Oder auch wenn ein Datentyp (bool/string) erwartet wurde, aber etwas
    anderes kommt, z.B:
        #IF ("foo" EQ NOT)
        #ENDIF
    
        => Grammar: bool/string expected not a uboolop (NOT) in '("foo" EQ NOT)' 
    
    Grund: '"foo"' ist hier ein String, 'EQ' der Operator und 'NOT'
    waere ein weiterer Operator (vom Typ unary boolean operator, kurz
    uboolop). Das macht natuerlich keinen Sinn.  
    
    Achtung: Es gibt auch den Operator 'NOT EQ' (oder auch 'NE').
    
        #IF ("foo" NOT EQ )
        #ENDIF
    
        => Grammar: string/bool not end of expression expected in '("foo" NOT EQ )'
    
    Hier wundert sich der Parser also darueber, dass der Ausruck zu Ende
    ist, obwohl es so ja keinen Sinn macht.
    
    Dann meckert der Parser noch ueber fehlerhaft Regulaere Ausdruecke
    (beim REQ Operator):
    
        #IF ("foo" REQ "(foo))")
        #ENDIF
    
        => Grammar: regular expression error: Unmatched ) before HERE mark in
           regex m/(foo)) << HERE / at .../site_intershopfx.pm line 718.
           in '("foo" REQ "(foo))")' 
    
    Hier ist ja auch eine Klammer zu viel (aber in einem String, darum
    nicht die Fehlermeldung von oben, aber dieser String laesst sich
    nicht als RegExp kompilieren, darum meckert Perl:
    
    Und dann verweigert der Parser natuerlich noch die Arbeit, wenn man
    ihm einen unbekannten Operator unterjubelt. Das wird aber eigentlich
    schon vom Lexxer verhindert (darum solltet ihr sowas nicht sehen):
    
        Grammar: unknown operator XXX (XXX) found in 'XXX'
    
    Und zum Abschluss:
    
        #IF ("foo" "bar" EQ)
        #ENDIF
    
        => Grammar: operator not string (bar) expected in '("foo" "bar" EQ)' 
    
    Der Operator muss natuerlich zwischen den Strings stehen.
    
    
    
    In der zweiten Klasse von Fehlermeldungen (Lexxer), werden Probleme
    beim Zerlegen der Ausdrucke in Tokens angezeigt.
    
    Das ist dann der beruehmte (den werdet ihr wohl am haeufigsten sehen):
        Lexxer Error: Unknown token 'XXX' in 'YYY'"
    
    Beispiele:
    
        #IF (foo+burp EQ "bar")
    
        => Lexxer Error: Unknown token '+' in '(foo+burp EQ "foo+burp")'
    
    Er meckert hier erst ueber das '+'. Das 'foo' erkennt er noch als
    String (wegen Abwaertskompatibilitaet, ihr solltest das Feature aber
    nicht nutzen!), aber es wird eine Warnung (STDERR -> Serverlogs)
    emitiert:
          Lexxer Warning: bareword 'foo' found. Please use quotes. at
          .../site_intershopfx.pm line 830. 
    
        #IF (foo burp EQ "bar")
    
    liefert also zwei von den obigen Warnungen (der erste String ist
    nach dem Space fuer den Parser zu Ende):
    
        => Grammar: operator not string (burp) expected in '(foo burp EQ "foo+burp")' 
    
    Ist uns jetzt ja allen klar warum dem so ist :-)
    
    Das mit den doppelten Anfuehrungezeichen gilt auch fuer <!--XX-foo-->-
    Variablen! Bzw. eigentlich ist das nicht ganze wahr, weil es zwei
    Datentypen gibt: 
    * Strings: Alles in " und (mit Warnung) alles, was sonst nichts ist,
      und aus Buchstaben, Zahlen und - besteht (([\w-]+).
      Gueltig: "foo", "bar", "<!--XX-foo-->" (falls da kein " oder \n drin ist).
      Gueltig mit Warnung: foo, bar, <!--XX-foo--> (vielleicht)
      Ungueltig: foo bar (zwei Strings mit Warnung), /imperia/md/ (/
      drin), NOT (Operator), yes (siehe unten, auch true und ok) 
      Ungueltig: NOT (weil Op
    * Boolean: Wahr oder falsch. Die duerfen nicht in Anfuehrungszeichen
      stehen, weil sie automatisch erkannt werden.
      Wahr: yes, true, 1, ok
      Falsch: no, false, 0
    
    Die Datentypen werden automatisch ineinander umgewandelt (wenn es
    noetig ist). z.B.
    
        #IF ("foo")
    
    Hier wird '"foo"' in einen wahren Wert umgewandelt. Jeder String ist
    wahr, ausser '"0"' und '""'. 
    Achtung: '"no"' ist im Gegensatz zu 'no' auch wahr!
    
    
    Hiernochmal eben eine Auflistung aller Operatoren:
    
    brace   : (,)
    string  : "((?:\\"|.)*?)"
    stringop: EQ, NE (alias: NOT EQ), REQ, CEQ, CNE (alias: NOT CEQ), LT,
              GT, LE, GE, <=, =>, ==, <, >
    boolop  : AND, OR, XOR
    uboolop :  NOT
    bool    : yes, true, 1, ok (alle wahr)   no, false, 0 (alle falsch)
    ostring : [\w-]+    (alte Strings, nicht mehr verwenden, Warnung!)
    Rest    : Lexxer Error
    
    
    Es sei nochmal auf das andere Standardwerk zur InterShopFX verwiesen:
    http://www.lackas.net/imp/ma/in/All/STZL8ItI50TWTnjo.html
    
    Ich hoffe ihr seid jetzt alle erleuchtet...
    
    Gruss
     Christian
    
    -- 
    Imperia AG - Development
    Königstr. 29 - D-52064 Aachen - http://www.imperia.net/
    The i6 branch of Imperia consists of 187,138 lines of
    perl code (including comments - Fri Aug 31 09:05:11 2001).
    
    
    Thread (I5: Lexxer Error: Unknown token '(Stellenangebot:)' in '(Stellenangebot:)' !)

    © 2001, 2002 marchive.pl Christian Lackas

    [HOME]   [MARCHIVE]   [INDEX]   [IMPERIA]   [IMPRESSUM]   [DELTA]