;;;-*- Mode: Lisp; Package: CONSTRAINT-GRAMMAR-PARSER -*- ;; Copyright (C) Paul Meurer 2002. All rights reserved. ;; paul.meurer@aksis.uib.no ;; Aksis, UNIFOB, University of Bergen ;; (in-package :cgp) #+test (order-constraints '((*-1 A) (*L B) (L-1 E) (LR0 F) (not 1 C) (1 D) (not 0 C) (-1c G) (2 D))) (defun sort-simple-constraints (sc) (sort sc (lambda (sc1 sc2) (let ((neg-p1 (eq (car sc1) 'NOT)) (neg-p2 (eq (car sc2) 'NOT))) (multiple-value-bind (pos1 abs-p1 careful-p1) (parse-position-operator (if neg-p1 (cadr sc1) (car sc1))) (multiple-value-bind (pos2 abs-p2 careful-p2) (parse-position-operator (if neg-p2 (cadr sc2) (car sc2))) (cond ((and (not abs-p1) abs-p2) t) ((and abs-p1 (not abs-p2)) nil) ((< (abs pos1) (abs pos2)) t) ((> (abs pos1) (abs pos2)) nil) ((and (not neg-p1) neg-p2) t) ((and neg-p1 (not neg-p2)) nil) ((and (not careful-p1) careful-p2) t) ((and careful-p1 (not careful-p2)) nil) ((> pos1 pos2) t) (t nil)))))))) #+test (sort-simple-constraints '((1 a) (0 b) (-1 c) (-2 d) (1c e))) #+test (order-constraints '((-2 be-noeyt-det r+1) (not r+1 be-ent-noeyt-adj) )) (defun order-constraints (constraints) (let ((simple-constraints ()) (scanning ()) (scan-partitions ())) (dolist (constraint constraints) (let ((neg-p (eq (car constraint) 'NOT))) (multiple-value-bind (pos abs-p careful-p scan-p backtrack-p left-link-p right-link-p) (parse-position-operator (if neg-p (cadr constraint) (car constraint))) ;; NEG-P POS ABS-P CAREFUL-P SCAN-P BACKTRACK-P LEFT-LINK-P RIGHT-LINK-P (let* ((ppo (list neg-p pos abs-p careful-p scan-p backtrack-p left-link-p right-link-p)) (parsed-constraint (if neg-p (caddr constraint) (cadr constraint))) (next-is-link-p (if neg-p (cdddr constraint) (cddr constraint)))) (cond ((or left-link-p right-link-p) (setf (cdr scanning) (append (cdr scanning) (list constraint)))) (next-is-link-p (setf scanning (list constraint)) (push scanning scan-partitions)) ((not scan-p) (setf scanning nil) (push constraint simple-constraints)) (neg-p (push constraint simple-constraints)) (t (setf scanning (list constraint)) (push scanning scan-partitions))))))) (append (sort-simple-constraints simple-constraints) (reduce #'append (nreverse scan-partitions))))) (defparameter *test-string* "I grunnforst�elsen av kriminallitteratur handler det om at vi arbeider med et narrativt m¿nster. Den hardkokte kriminalfortellingen vokser fram i Amerika rundt 1930 og kan sies � bygge p� m¿nsteret av den klassiske: Elementer som forbrytelse, etterforskning og oppklaring beholdes, men vekten flyttes fra enkelte pilarer i den narrative strukturen til andre, slik at formelens tyngdepunkt skifter. I den hardkokte fortellingen er det helten og hans jakt p� den skyldige som st�r i sentrum. Den hardkokte helten deltar langt mer aktivt - ikke minst fysisk - enn forgjengeren. Det g�tefulle i forbrytelsen spilles over p� sidelinja. Storbyens utfordringer appellerer ikke til intellektuell lek, men plasserer helten i sentrum for begivenhetene p� en slik m�te at han ofte selv er truet. Konfrontasjonen mellom helt og skurk er et moment som det fester seg like mye spenning til som selve oppklaringen. Dette gir fortellingen et akselererende, actionpreget tilsnitt, der timing, rask handling og kynisme er egenskaper som favoriserer v�r mann i kampen. Han er ofte trengt opp i et hj¿rne der den eneste utveien er � sl� eller skyte seg ut av situasjonen. I den klassiske kunstsjangeren har hverdagens ¿konomi liten innflytelse. Moralske og sosiale problemer reduseres til et spill. Men den hardkokte helten lever i og er en uvegerlig del av den virkeligheten han etterforsker. Gjennom hans ¾refulle ferd i en r�tten verden setter den hardkokte sjangeren samfunnsproblemer under debatt. Ofte kan helten bare justere sm� feil i samfunnsmaskineriet, f¿r alt blir like ille igjen. Kritikken rammer slik ikke bare det forbryterske individet, men selve det korrupte og uoversiktlige systemet som gj¿r det umulig for v�r helt � frigj¿re seg fra ondskapens klebrige allstedsn¾rv¾r. Dorothy Sayers hadde forstyrret den klassiske detektivfortelligens konvensjonelle simplisitet med introduksjonen av det tradisjonelt sett kvinnelige konseptet \"romansen\". Sayers s� selv dette som en svakhet: \"Jo mindre kj¾rlighet i en detektivfortelling, jo bedre\", skriver hun i introduksjonen til Omnibus of Crime (1927). Erotiske innslag flyttet oppmerksomheten bort fra puslespillmysteriet og over p� andre aspekter. I den hardkokte sjangeren utbroderes tanken om lysten som livets villnis. Den hardkokte formelen introduserer en helt ny kvinneskikkelse - den usedvanlig tiltrekkende bedragersken - for � demonstrere dette: Gjennom skildringer av kvinnens fatalitet og heltens avvisning av romantiske forbindelser framst�r kvinnen som svikefull, mannen som ¾rbar. For helten representerer den forf¿reriske femme fatale b�de nytelse og fare; han innleder gjerne et forhold til henne, men det viser seg at hun ofte spiller en sentral rolle i sammensvergelsen. N�r sannheten g�r opp for ham, tvinges han til � konfrontere henne, og dette leder ikke sjelden til den mest brutale volden i fortellingene. B�de i Dashiell Hammets The Maltesefalcon (1929) og i Mickey Spillanes I, the Jury (1948) g�r de kvinnelige hovedpersonene vantro skjebnen i m¿te. Spillanes helt, Mike Hammer, henretter til og med objektet for sitt begj¾r og erkl¾rer: \"It was easy\". P� denne m�ten overmanner helten det onde, som for anledningen er manifestert i kvinneskikkelse, og undertvinger ogs� sin egen seksualitet en type forst�else der denne sees som en undergrunnskraft som truer med � forderve menneskets (mannens) �nd.") ;; (count #\Space *test-string*) ;; ca. 500 words #+test (progn (cl-user::gc) (time (let ((*show-used-rules* nil)) (setf *check-constraint-count* 0) (disambiguate-from-string *test-string* :print-function (lambda (&rest rest) (declare (ignore rest))) :tagging-niveau ; :multi-tagging :syntactic-disambiguation ;:multi-tagging ;:syntactic-mapping :cg (gethash "nbo" *cg-table*) )))) ;; 12.12.2002, MCL5.0b G4 450MHz ;; mt 1.104 seconds, 1,263,536 bytes ;; md 8.019 seconds, 1,369,472 bytes ; 7.485 sec order-constraints ;; sd 17.698 seconds, 1,561,816 bytes ; 17.406 sec order-constraints ; 16.832 sec only morph. rules ordered :eof