1010from collections import OrderedDict
1111
1212if sys .version_info [0 ]== 2 :
13- from extensions import * # pylint: disable=E0401,W0401
13+ from extensions import * # pylint: disable=E0401,W0401
1414else :
15- from dharma .core .extensions import * # pylint: disable=W0401,W0614
15+ from dharma .core .extensions import * # pylint: disable=W0401,W0614
1616
1717
1818class GenState :
@@ -96,7 +96,7 @@ def __init__(self, ident, machine):
9696self .namespace = machine .namespace
9797self .lineno = machine .lineno
9898
99- def id (self ):# pylint: disable=invalid-name
99+ def id (self ):# pylint: disable=invalid-name
100100return "Line %d [%s]" % (self .lineno ,self .namespace )
101101
102102def __hash__ (self ):
@@ -136,7 +136,7 @@ def append(self, value):
136136return
137137self .leaf .append (value )
138138
139- def generate (self ,state ):# pylint: disable=too-many-branches
139+ def generate (self ,state ):# pylint: disable=too-many-branches
140140if not state .leaf_mode :
141141state .leaf_trigger += 1
142142if state .leaf_trigger > DharmaConst .LEAF_TRIGGER :
@@ -186,12 +186,14 @@ def clear(self):
186186
187187def generate (self ,state ):
188188"""Return a random variable if any, otherwise create a new default variable."""
189- if self .count :
189+ if self .count >= random . randint ( DharmaConst . VARIABLE_MIN , DharmaConst . VARIABLE_MAX ) :
190190return "%s%d" % (self .var ,random .randint (1 ,self .count ))
191- self .count += 1
192191var = random .choice (self )
192+ prefix = self .eval (var [0 ],state )
193+ suffix = self .eval (var [1 ],state )
194+ self .count += 1
193195element_name = "%s%d" % (self .var ,self .count )
194- self .default = "%s%s%s" % (self . eval ( var [ 0 ], state ), element_name ,self . eval ( var [ 1 ], state ) )
196+ self .default + ="%s%s%s\n " % (prefix , element_name ,suffix )
195197return element_name
196198
197199
@@ -202,7 +204,7 @@ def generate(self, state):
202204return self .eval (random .choice (self ),state )
203205
204206
205- class DharmaMachine :# pylint: disable=too-many-instance-attributes
207+ class DharmaMachine :# pylint: disable=too-many-instance-attributes
206208def __init__ (self ,prefix = "" ,suffix = "" ,template = "" ):
207209self .section = None
208210self .level = "top"
@@ -237,13 +239,13 @@ def __init__(self, prefix="", suffix="", template=""):
237239def process_settings (self ,settings ):
238240"""A lazy way of feeding Dharma with configuration settings."""
239241logging .debug ("Using configuration from: %s" ,settings .name )
240- exec (compile (settings .read (),settings .name ,'exec' ),globals (),locals ())# pylint: disable=exec-used
242+ exec (compile (settings .read (),settings .name ,'exec' ),globals (),locals ())# pylint: disable=exec-used
241243
242244def set_namespace (self ,name ):
243245self .namespace = name
244246self .lineno = 0
245247
246- def id (self ):# pylint: disable=invalid-name
248+ def id (self ):# pylint: disable=invalid-name
247249return "Line %d [%s]" % (self .lineno ,self .namespace )
248250
249251def parse_line (self ,line ):
@@ -372,6 +374,14 @@ def parse_assign_value(self, tokens):
372374self .current_obj .append (tokens )
373375
374376def parse_assign_variable (self ,tokens ):
377+ """
378+ Example:
379+ tokens
380+ dharma.String: 'let ',
381+ dharma.ElementXRef: 'GrammarNS:<VarName>',
382+ dharma.String: '= new ',
383+ dharma.ValueXRef: 'GrammarNS:<ValueName>'
384+ """
375385for i ,token in enumerate (tokens ):
376386if isinstance (token ,ElementXRef ):
377387variable = token .value
@@ -385,7 +395,7 @@ def parse_assign_variable(self, tokens):
385395if not isinstance (self .current_obj ,DharmaVariable ):
386396logging .error ("%s: Inconsistent object for variable assignment" ,self .id ())
387397sys .exit (- 1 )
388- prefix ,suffix = tokens [:i ],tokens [i + 1 :]# pylint: disable=undefined-loop-variable
398+ prefix ,suffix = tokens [:i ],tokens [i + 1 :]# pylint: disable=undefined-loop-variable
389399self .current_obj .append ((prefix ,suffix ))
390400
391401def parse_assign_variance (self ,tokens ):