Description
A generator of random texts from EBNF-like grammars.
Install
- Install Ruby 1.9.3 or higher.
gem install gen-text
Example
Simple grammar:
expr =
expr ('+'|'-') expr |
expr ('*'|'/') expr |
'(' expr ')' |
0...1000 ;
Sample output:
(914-548*155+131*799)*827
See more examples in "sample" directory.
Usage
Run it with the command:
Here file.g
is a file containing the grammar description which consists of the rule definitions:
nonterminal1 = expr1 ;
nonterminal2 = expr2 ;
nonterminal3 = expr3 ;
Nonterminals start from a letter or "_" and may contain alphanumeric characters, "_", "-" and ":".
You may also use backquoted nonterminals:
`nonterminal1` = expr1 ;
`Nonterminal with arbitrary characters: [:|:]\/!` = expr2 ;
Trailing ";" can be omitted:
nonterminal1 = expr1
nonterminal2 = expr2
nonterminal3 = expr3
Also you may omit the left part in the first rule:
expr1
nonterminal2 = expr2
nonterminal3 = expr3
You may use C++-like comments:
// A comment
/* Another comment */
Expressions
You may use the following expressions in the rules' right part:
Expression | Meaning |
"str"
'str'
|
Generate a string.
Following escape sequences are allowed: "\n", "\t", "\e" and "\." where "." is an arbitrary character.
|
U+HHHH |
Generate an UTF-8 character sequence corresponding to the Unicode code. E. g.: U+000A is equivalent to "\n". |
n (a number) |
Generate a number |
m...n |
Generate a random number between m and n (inclusive). |
nonterm |
— |
Combinators |
expr expr |
Sequence. |
expr | expr
|
Random choice. |
| expr
| expr
|
Random choice (another form). |
| [m%] expr
| [n%] expr
| expr
|
Random choice with specific probabilities.
If probability is unspecified then it is calculated automatically.
|
| [0.1] expr
| [0.3] expr
| expr
|
The same as above. Probabilities may be specified as floating point numbers between 0.0 and 1.0.
|
expr*
expr+
expr?
expr*[n]
expr*[m...n]
|
Repeat expr many times:
- 0 or more times
- 1 or more times
- 0 or 1 time
- exactly n times
- between m and n times
Note: you may use inf ("infinity") instead of m or n.
|
n:expr
|
Capture a string generated by expr into variable n. The variable may then be used in Ruby code insertions.
You may also use names like $n and @n.
Note: presence of this expression turns on backtracking and output buffering and may result in enormous memory usage.
|
n := expr
|
The same as above but the output generated by expr is discarded.
|
Ruby code insertions |
{ code } |
Execute the code. Generate nothing.
Note: all code insertions inside a rule share the same scope.
|
{= code } |
Generate a string returned by the code. |
{? code } |
Condition. A code which must evaluate to true.
Note: presence of this expression turns on backtracking and output buffering and may result in enormous memory usage.
|
Alternate syntax
You may use "<-" instead of "=":
nonterm1 <- expr1 ;
nonterm2 <- expr2 ;
and "/" instead of "|":
`simple choice` <- "a" / "b" ;
Links