Vänsterrekursion

I den formella språkteorin för datavetenskap är vänsterrekursion ett specialfall av rekursion där en sträng känns igen som en del av ett språk genom att den bryts ner till en sträng från samma språk (till vänster) och ett suffix (på den rätta). Till exempel kännas igen som en summa eftersom den kan delas upp i också en summa, och , ett lämpligt suffix.

När det gäller kontextfri grammatik är en icke-terminal vänsterrekursiv om symbolen längst till vänster i en av dess produktioner är sig själv (vid direkt vänsterrekursion) eller kan göras själv genom någon sekvens av substitutioner (vid indirekt vänster rekursion).

Definition

En grammatik är vänsterrekursiv om och endast om det finns en icke-terminal symbol som kan härledas till en meningsform med sig själv som symbolen längst till vänster. Symboliskt,

,

där indikerar operationen att göra en eller flera substitutioner, och är valfri sekvens av terminala och icketerminala symboler.

Direkt vänsterrekursion

Direkt vänsterrekursion uppstår när definitionen kan tillfredsställas med endast en substitution. Det kräver en formregel

där är en sekvens av icke-terminaler och terminaler . Till exempel regeln

är direkt vänsterrekursiv. En vänster-till-höger rekursiv descent parser för denna regel kan se ut

  
  
  
  
 void  Uttryck  ()  {  Uttryck  ();  match  (  '+'  );  Term  ();  } 

och sådan kod skulle falla i oändlig rekursion när den körs.

Indirekt vänsterrekursion

Indirekt vänsterrekursion uppstår när definitionen av vänsterrekursion uppfylls via flera substitutioner. Det innebär en uppsättning regler som följer mönstret

där är sekvenser som var och en kan ge den tomma strängen , medan kan vara alla sekvenser av terminala och icke-terminala symboler. Observera att dessa sekvenser kan vara tomma. Härledningen

ger sedan längst till vänster i sin slutliga meningsform.

Ta bort vänsterrekursion

Vänsterrekursion ställer ofta till problem för analyserare, antingen för att det leder dem till oändlig rekursion (som i fallet med de flesta uppifrån-och-ned-parsare ) eller för att de förväntar sig regler i en normal form som förbjuder det (som i fallet med många nedifrån och upp) parsers , inklusive CYK-algoritmen ). Därför är en grammatik ofta förbearbetad för att eliminera vänsterrekursionen.

Ta bort direkt vänsterrekursion

Den allmänna algoritmen för att ta bort direkt vänsterrekursion följer. Flera förbättringar av denna metod har gjorts. För en vänsterrekursiv icketerminal , kassera alla regler av formen och överväg de som finns kvar:

var:

  • varje är en icke-tom sekvens av icke-terminaler och terminaler, och
  • varje är en sekvens av icke-terminaler och terminaler som inte börjar med .

Ersätt dessa med två uppsättningar produktioner, en uppsättning för :

och en annan uppsättning för den färska icketerminalen (ofta kallad "svansen" eller "resten"):

Upprepa denna process tills ingen direkt vänsterrekursion återstår.

Som ett exempel, betrakta regeluppsättningen

Detta skulle kunna skrivas om för att undvika vänsterrekursion som

Tar bort all vänsterrekursion

Genom att etablera en topologisk ordning på icke-terminaler kan ovanstående process utökas till att även eliminera indirekt vänsterrekursion [ citat behövs ] :

Inmatningar A grammatik: en uppsättning icke-terminaler och deras produktioner
Utdata En modifierad grammatik som genererar samma språk men utan vänsterrekursion
  1. För varje icke-terminal :
    1. Upprepa tills en iteration lämnar grammatiken oförändrad:
      1. För varje regel displaystyle en sekvens av terminaler och icke-terminaler:
        1. Om börjar med en icketerminal och :
          1. Låt vara utan dess inledande .
          2. Ta bort regeln .
          3. För varje regel :
            1. Lägg till regeln .
    2. Ta bort direkt vänsterrekursion för enligt beskrivningen ovan.

Observera att denna algoritm är mycket känslig för den icke-terminala ordningen; optimeringar fokuserar ofta på att välja denna beställning väl. [ förtydligande behövs ]

Fallgropar

Även om ovanstående omvandlingar bevarar språket som genereras av en grammatik, kan de ändra parseträden som bevittnar strängars igenkänning. Med lämplig bokföring trädomskrivning återställa originalen, men om detta steg utelämnas kan skillnaderna ändra semantiken för en analys.

Associativitet är särskilt sårbart; vänsterassociativa operatorer förekommer vanligtvis i högerassociativa-liknande arrangemang under den nya grammatiken. Till exempel, börja med denna grammatik:

standardtransformationerna för att ta bort vänsterrekursion ger följande:

Att analysera strängen "1 - 2 - 3" med den första grammatiken i en LALR-parser (som kan hantera vänsterrekursiva grammatiker) skulle ha resulterat i analysträdet:

Left-recursive parsing of a double subtraction

Detta analysträd grupperar termerna till vänster, vilket ger korrekt semantik (1 - 2) - 3 .

Att analysera med den andra grammatiken ger

Right-recursive parsing of a double subtraction

vilket, korrekt tolkat, betyder 1 + (-2 + (-3)), också korrekt, men mindre trogen inmatningen och mycket svårare att implementera för vissa operatörer. Lägg märke till hur termer till höger visas djupare i trädet, ungefär som en högerrekursiv grammatik skulle ordna dem för 1 - (2 - 3) .

Tillmötesgående vänsterrekursion i top-down parsing

En formell grammatik som innehåller vänsterrekursion kan inte tolkas av en LL(k)-parser eller annan naiv rekursiv härkomsttolkare om den inte konverteras till en svagt ekvivalent högerrekursiv form. Däremot är vänsterrekursion att föredra för LALR-parsers eftersom det resulterar i lägre stackanvändning än högerrekursion . Men mer sofistikerade top-down-tolkare kan implementera generella sammanhangsfria grammatiker genom att använda inskränkning. 2006 beskrev Frost och Hafiz en algoritm som rymmer tvetydiga grammatiker med direkt vänsterrekursiva produktionsregler . Den algoritmen utökades till en komplett parsningsalgoritm för att tillgodose indirekt såväl som direkt vänsterrekursion i polynomtid och för att generera kompakta representationer i polynomstorlek av det potentiellt exponentiella antalet parseträd för mycket tvetydiga grammatiker av Frost, Hafiz och Callaghan 2007 Författarna implementerade sedan algoritmen som en uppsättning parserkombinatorer skrivna i programmeringsspråket Haskell .

Se även

  1. ^ Anteckningar om formell språkteori och analys , James Power, Institutionen för datavetenskap National University of Ireland, Maynooth Maynooth, Co. Kildare, Irland.JPR02
  2. ^ Moore, Robert C. (maj 2000). "Ta bort vänster rekursion från kontextfria grammatiker" ( PDF) . 6th Applied Natural Language Processing Conference : 249–255.
  3. ^   Frost, R.; R. Hafiz (2006). "En ny top-down-analysalgoritm för att tillgodose tvetydighet och vänsterrekursion i polynomtid" . ACM SIGPLAN-meddelanden . 41 (5): 46–54. doi : 10.1145/1149982.1149988 . S2CID 8006549 . , tillgänglig från författaren på http://hafiz.myweb.cs.uwindsor.ca/pub/p46-frost.pdf Arkiverad 2015-01-08 på Wayback Machine
  4. ^ Frost, R.; R. Hafiz; P. Callaghan (juni 2007). "Modulär och effektiv top-down-analys för tvetydiga vänsterrekursiva grammatiker" ( PDF) . 10:e internationella workshopen om analysteknik (IWPT), ACL-SIGPARSE : 109–120. Arkiverad från originalet (PDF) 2011-05-27.
  5. ^   Frost, R.; R. Hafiz; P. Callaghan (januari 2008). Parser Combinators for tvetydiga vänster-rekursiva grammatiker (PDF) . 10:e internationella symposiet om praktiska aspekter av deklarativa språk (PADL), ACM-SIGPLAN . Föreläsningsanteckningar i datavetenskap. Vol. 4902. s. 167–181. doi : 10.1007/978-3-540-77442-6_12 . ISBN 978-3-540-77441-9 .

externa länkar