Ragel

Ragel
Utvecklare Adrian Thurston
Stabil frisättning
6.10 / 24 mars 2017 ; 5 år sedan ( 2017-03-24 )
Förhandsgranska release
7.0.4 / 16 februari 2021 ; för 2 år sedan ( 2021-02-16 )
Förvar
Skrivet i C++
Operativ system Unix-liknande , Windows
Typ Statens maskinkompilator
Licens
"Ragel 6 förblir under GPL v2 [genererad kod] som omfattas av MIT (eller GPL v2)". Ragel 7: MIT-licens
Hemsida www .colm .net /open-source /ragel /

Ragel är en maskinkompilator med ändligt tillstånd och en parsergenerator . Ursprungligen stödde Ragel utdata för C , C++ och Assembly -källkod, och utökades för att stödja flera andra språk inklusive Objective C , D , Go , Ruby och Java . Ytterligare språkstöd är också under utveckling. Den stöder generering av tabell- eller kontrollflödesdrivna tillståndsmaskiner från reguljära uttryck och/eller tillståndsdiagram och kan även bygga lexikalanalysatorer via metoden med längsta matchning. Ragel inriktar sig specifikt på textanalys och indatavalidering .

Översikt

Ragel stöder generering av tabell- eller kontrollflödesdrivna tillståndsmaskiner från reguljära uttryck och/eller tillståndsdiagram och kan även bygga lexikaliska analysatorer via metoden med längsta matchning . En unik egenskap hos Ragel är att användaråtgärder kan associeras med godtyckliga tillståndsmaskinövergångar med hjälp av operatorer som är integrerade i de reguljära uttrycken. Ragel stöder även visualisering av den genererade maskinen via graphviz .

Visualisierung Ragel.png

Grafen ovan representerar en tillståndsmaskin som tar användarinmatning som en serie byte som representerar ASCII -tecken och kontrollkoder. 48..57 motsvarar det reguljära uttrycket [0-9] (dvs vilken siffra som helst), så endast sekvenser som börjar med en siffra kan kännas igen. Om 10 (radmatning) påträffas är vi klara. 46 är decimalkomma ('.'), 43 och 45 är positiva och negativa tecken ('+', '-') och 69/101 är versaler/gemener 'e' (för att indikera ett tal i vetenskapligt format). Som sådan kommer den att känna igen följande ordentligt:

2 45 055 78.1 2e5 78.3e12 69.0e-3 3e+3

men inte:

.3 46. -5 3.e2 2e5.1

Syntax

Ragels input är ett reguljärt uttryck endast i den meningen att det beskriver ett reguljärt språk ; det skrivs vanligtvis inte i ett kortfattat reguljärt uttryck, utan skrivs ut i flera delar som i Extended Backus–Naur-form . Till exempel, istället för att stödja POSIX-teckenklasser i regex-syntax, implementerar Ragel dem som inbyggda produktionsregler. Som med vanliga parsergeneratorer tillåter Ragel hantering av kod för produktioner som kan skrivas med syntaxen. Koden som ger exemplet ovan från den officiella webbplatsen är:

       
       
       
  
    


  
           
            
 

      action  dgt  {  printf("DGT: %c\n", fc);  }  action  dec  {  printf("DEC: .\n");  }  action  exp  {  printf("EXP: %c\n", fc);  }  action  exp_sign  {  printf("SGN: %c\n", fc);  }  åtgärdsnummer  {  /*NUMMER*/  }  # Ett flytande kommatal  .  nummer  =  (  [0-9]  +  $  dgt  (  '.'  @  dec  [0-9]  +  $  dgt  )?  (  [eE]  (  [+\-]  $  exp_sign  )?  [0-9]  +  $  exp  ) ?  )  %  antal  ;  main  :=  (  nummer  '\n'  )*  ; 

Se även

externa länkar