Project

gen-text

0.0
No commit activity in last 3 years
No release in over 3 years
A generator of random texts from EBNF-like grammars. It features probability management, code insertions and conditional generation with conditions written in Ruby.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

 Project Readme

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:

gen-text file.g

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