Kleene Plus Closure of Regular Grammars
Algorithm
Given regular grammar G, we would like to construct a regular
grammar G' such that L(G') = (L(G))+:
- remove
from the language described by G (see the
relevant section), thereby removing
all
-productions from the grammar;
- for every rule in the form A
a (A being a non-terminal
and a a single terminal), we add the rule
A
aS, where S is the start symbol of G;
- if S

was originally in the productions of G, we add
to the language generated by the grammar (see the
relevant section)
Example
Give a regular grammar recognising the Kleene plus closure of the
language recognised by the following grammar:
| S |  |
aA | bB |
| A |  |
aA | a | |
| B |  |
c | bS |  |
where S is the start symbol.
- Remove
from the language:
| S |  |
a | b | aA | bB |
| A |  |
aA | a |
| B |  |
c | bS |
where S is the start symbol.
Note that
was not in the language, but the
procedure removes the undesirable
-productions in the
grammar.
- For every rule in the form A
a (A being a non-terminal
and a a single terminal), we add the rule
A
aS:
| S |  |
a | aS | b | bS |
aA | bB |
| A |  |
aA | a | aS |
| B |  |
c | cS | bS |
where S is the start symbol.
- Since the language did not contain the empty string (since
S

was not in the grammar), we are done.
Exercises
Construct regular grammars which recognise the Kleene plus closure of the
languages described using the following regular grammars:
-
| G = < | { a, b, c }, |
| | { S, A, B, C }, |
| |
| { |
S |
 |
aA | bC, |
| |
A |
 |
aA | bB |
, |
| |
B |
 |
bB | b |
, |
| |
C |
 |
cB | cC |
}, |
|
| | S > |
-
| G = < | { a, b, c }, |
| | { S, A, B, C }, |
| |
| { |
S |
 |
aA | bC |
, |
| |
A |
 |
aA | aS, |
| |
B |
 |
b, |
| |
C |
 |
cB | cS }, |
|
| | S > |
-
| G = < | { a, b, c }, |
| | { S, A, B, C }, |
| |
| { |
S |
 |
aA | bC |
, |
| |
A |
 |
aA | aS, |
| |
B |
 |
b, |
| |
C |
 |
cB | cS }, |
|
| | S > |
-
| G = < | { a, b }, |
| | { S, A }, |
| | |
| | S > |
-
| G = < | { a }, |
| | { S }, |
| | { S },
|
| | S > |