Jag upptäckte just ett fel i SFST, dvs den databasen som innehåller alla svenska lagtexter i konsoliderad form, och som ligger till grund för lagen.nu Inget unikt med det, det förekommer fel där då och då, vilket jag vanligtvis märker genom att någon kodsnutt går sönder eftersom den inte var skriven för att indatat skulle vara så trasigtmärkligt. Över tiden har jag utvecklat ett system för att hantera sådana här felaktigheter – jag skriver helt enkelt en patch, som appliceras först av allt innan resten av parsekoden kör.
Som ett exempel på ett typiskt fel, kolla 3 § PUL i SFST:
3 § I denna lag används följande beteckningar med nedan angiven betydelse. Beteckning Betydelse Behandling (av person) Varje åtgärd eller serie av uppgifter) åtgärder som vidtas i fråga om personuppgifter, vare sig det sker på automatisk väg eller inte, t.ex. insamling, registrering, organisering, lagring, bearbetning eller ändring, återvinning, inhämtande, användning, utlämnande genom översändande, spridning eller annat tillhandahållande av uppgifter, sammanställning eller samkörning, blockering, utplåning eller förstöring.
Dvs vänstercellen i tabellen har en högerparantes där det borde vara ett bindestreck.
Detta löses genom en patch i unified diff-format. Den appliceras, resten av parsningen tar vid, resultatet blir fint (och, nota bene, med en liten förklaring om att texten faktiskt har ändrats – transparens är viktigt).
(jo, jag har rapporterat det upstream också, och de som sköter SFST vet var de kan hitta mitt patcharkiv. Vissa fel har rättats med tiden, men inte alla).
Generellt försöker jag låta bli att lösa parsningsproblem med en patch – i en korpus så stor som SFST kan man nästan utgå från att alla tänkbara klasser av fel förekommer fler gånger. Om det är möjligt att lösa problemet generellt i själva parsningen, genom någon typ av workaround, är det att föredra framför att specialbehandla lagtext för lagtext. Ovanstående fel tror jag inte är möjligt att hantera generellt.
Men nu har jag hittat ett fel som är sådär på gränsen: I köplagens första paragraf, fjärde stycket finns texten ”Vid köp av byggnad som uppförts för stadigvarande bruk gäller […] vad som föreskrivs i 4 kap. 11, 12 och 18–19d §§ jordabalken”
Felet här är i slutet av meningen – den avslutas med en lista av hänvisningar, där den sista går till 4 kap. 19 d § jordabalken. När lagstiftaren ändrar en lag så vill denne ibland stoppa in nya paragrafer mellan exv 19 § och 20 § — dessa får då beteckningarna 19 a §, 19 b § osv.
(Sidnot: Amerikanska lagstiftare har i allmänhet löst det här på ett sätt som är mer tilltalande för gamla basicprogrammerare – kolla exempelvis Oregons reglering av forumregler i civilmål och notera att numreringen lämnar gott om utrymme att stoppa in nya bestämmelser mellan de befintliga, vilket också görs då och då).
Det svenska sättet att stoppa in nya paragrafer gör det krångligare att skriva en parser för lagtext — den måste klara av uttrycket ”3 §”, ”3 och 4 §§”, ”3 e §”, ”3 eller 4 §” och många många fler (glöm för allt i världen inte att ”10 § f” är något helt annat än ”10 f §”). Den EBNF-grammatik som används har vuxit fram organiskt över några år, och kan ge känsliga personer mardrömmar.
Av den anledningen blir jag lite kallsvettig varje gång jag ser ett nytt sätt att hänvisa till lagrum som systemet inte klarar av att parsea. Exemplet ovan — som kan förenklas till ”19d § jordabalken” — är ett sådant. Med den skillnaden att hänvisningen faktiskt är felaktig: paragrafen har nummer ”19 d”, inte ”19d”.
Så frågan är: Ska jag fixa det med specialbehandling, dvs skriva en patch, eller ska jag försöka arbeta runt problemet genom att ändra min EBNF-grammatik? En vägledning kan man få genom grep
— vi kan helt enkelt kolla hur många andra förekomster av det här felaktiga sättet att hänvisa som vi hittar:
find data/sfs/intermediate -name "*.txt" | xargs egrep '[0-9][a-z] §' data/sfs/intermediate/1980/770.txt:5 § Vid tillämpning av 11a § tredje stycket kungörelsen (1972:412 ) om data/sfs/intermediate/1990/931.txt:kap. 11, 12 och 18--19d §§ jordabalken. Om en tomträttsupplåtelse enligt data/sfs/intermediate/1995/238.txt:-- 22--23, 25--26, 30 och 35--44a §§ kungörelsen (1969:380) om data/sfs/intermediate/1995/238.txt:vapenfri tjänst skall 12--17a §§ kungörelsen (1966:414) med vissa data/sfs/intermediate/1996/844.txt:d) Bestämmelserna om sanktioner i 31a-31e §§ lokalradiolagen data/sfs/intermediate/1997/1157.txt:reglerna, jfr 72a § lagen nr 612 den 24 juni 1996 om social data/sfs/intermediate/1998/488.txt:stycket finns i 2a §. I fråga om utfärdande av nytt data/sfs/intermediate/1999/1229.txt:Vad som sägs i 2 kap. 3 §, 6 kap. 5, 10a och 16a §§, 17kap.
Ok, åtta fel är inte jättemånga, men jag får väga risken av att introducera nya fel genom en ändrad grammatik (vilken hålls nere av ett stort batteri med testfall) mot det tråkiga och tidskrävande arbetet att göra åtta patchfiler (samt den potentiella nyttan av att de appliceras upstream).