Ragel
Utvecklare | Adrian Thurston |
---|---|
Stabil frisättning | 6.10 / 24 mars 2017
|
Förhandsgranska release | 7.0.4 / 16 februari 2021
|
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 |
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 .
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
- Jämförelse av parsergeneratorer
- Körbar UML
- Finite-state maskin
- Vanligt uttryck
- Thompsons konstruktion - algoritmen som används av Ragel
- Umple
- Helsinki Finite-State Technology (HFST)
externa länkar
- Media relaterade till Ragel på Wikimedia Commons
- Officiell hemsida