Ragel

{{Infobox software

| name = Ragel

| logo =

| screenshot =

| caption =

| developer = Adrian Thurston[http://www.complang.org/thurston/ Dr. Adrian D. Thurston] at complang.org Last changed: Jul 14, 2013

| programming language = C++

| genre = State machine compiler

| license = "Ragel 6 remains under GPL v2 [generated code] covered by the MIT (or GPL v2)".{{Cite web|url=http://www.colm.net/open-source/ragel/|title=Ragel State Machine Compiler|website=www.colm.net|access-date=2019-11-19}}
Ragel 7: MIT License

| website = {{URL|http://www.colm.net/open-source/ragel/}}

| latest release version = {{wikidata|property|preferred|references|edit|P348|P548=Q2804309}} | latest release date = {{Start date and age|{{wikidata|qualifier|preferred|single|P348|P548=Q2804309|P577}}|df=yes}}

| latest preview version = 7.0.4

| latest preview date = {{Start date and age|2021|2|16}}

| operating system = Unix-like, Windows

}}

Ragel (IPA: {{IPA|/ˈɹeɪd͡ʒəl/}}) is a finite-state machine compiler and a parser generator. Initially Ragel supported output for C, C++ and Assembly source code,Adrian D. Thurston. "[http://www.complang.org/thurston/thurston_CIAA_06_sing_regex.pdf Parsing Computer Languages with an Automaton Compiled from a Single Regular Expression.] {{webarchive|url=https://web.archive.org/web/20120907061836/http://www.complang.org/thurston/thurston_CIAA_06_sing_regex.pdf|date=2012-09-07}}" In: 11th International Conference on Implementation and Application of Automata (CIAA 2006), Lecture Notes in Computer Science, volume 4094, p. 285-286, Taipei, Taiwan, August 2006. later expanded to support several other languages including Objective-C, D, Go, Ruby, and Java.{{cite web|date=March 2017|title=Ragel User Guide|url=http://www.colm.net/files/ragel/ragel-guide-6.10.pdf}} Additional language support is also in development.{{cite web|date=18 May 2018|title=Additional Target Languages Return to Ragel 7|url=http://www.colm.net/news/2018/05/18/new-target-langs.html}} It supports the generation of table or control flow driven state machines from regular expressionsLiqun Chen, Chris J. Mitchell, Andrew Martin (2009) Trusted Computing: Second International Conference, Trust 2009 Oxford, UK, April 6–8, 2009, Proceedings. p. 111 and/or state charts and can also build lexical analysers via the longest-match method. Ragel specifically targets text parsing and input validation.Omar Badreddin (2010) "Umple: a model-oriented programming language." Software Engineering, 2010 ACM/IEEE 32nd International Conference on. Vol. 2. IEEE, 2010.

Overview

Ragel supports the generation of table or control flow driven state machines from regular expressions and/or state charts and can also build lexical analysers via the longest-match method.

A unique feature of Ragel is that user actions can be associated with arbitrary state machine transitions using operators that are integrated into the regular expressions. Ragel also supports visualization of the generated machine via graphviz.

{{wide image|File:Visualisierung_Ragel.png|1129px}}

The above graph represents a state-machine that takes user input as a series of bytes representing ASCII characters and control codes. 48..57 is equivalent to the regular expression [0-9] (i.e. any digit), so only sequences beginning with a digit can be recognised. If 10 (line feed) is encountered, the program is done. 46 is the decimal point ('.'), 43 and 45 are positive and negative signs ('+', '-') and 69/101 is uppercase/lowercase 'e' (to indicate a number in scientific format). As such, it will recognize the following properly:

2

45

055

78.1

2e5

78.3e12

69.0e-3

3e+3

but not:

.3

46.

-5

3.e2

2e5.1

Syntax

Ragel's input is a regular expression only in the sense that it describes a regular language; it is usually not written in a concise regular expression, but written out into multiple parts like in Extended Backus–Naur form. For example, instead of supporting POSIX character classes in regex syntax, Ragel implements them as built-in production rules. As with usual parser generators, Ragel allows for handling code for productions to be written with the syntax.{{cite web|date=March 2017|title=Ragel User Guide|url=http://www.colm.net/files/ragel/ragel-guide-6.10.pdf}} The code yielding the above example from the official website is:

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); }

action number { /*NUMBER*/ }

  1. A floating-point number literal.

number = (

[0-9]+ $dgt ( '.' @dec [0-9]+ $dgt )?

( [eE] ( [+\-] $exp_sign )? [0-9]+ $exp )?

) %number;

main := ( number '\n' )*;

See also

References

{{reflist|30em}}