Artifact Content
Not logged in

Artifact e37c83f645af4d82b55a33bb252fdb0194ef1a77


     1  /**
     2   * Authors: k.inaba
     3   * License: NYSL 0.9982 http://www.kmonos.net/nysl/
     4   *
     5   * Definition of constants related to the layers.
     6   */
     7  module polemy.layer;
     8  import polemy._common;
     9  
    10  /// Type for the layer ID
    11  
    12  alias string Layer;
    13  
    14  enum : Layer
    15  {
    16  	LiftLayer     = "(lift)",     /// Predefined layer for storing lift functions
    17  	NoopLayer     = "(noop)",     /// Predefined layer for just allocating a slot for table
    18  	ValueLayer    = "@value",     /// Predefined layer for normal run
    19  	MacroLayer    = "@macro",     /// Predefined layer for macro run (@lay() changes layer)
    20  	RawMacroLayer = "(rawmacro)", /// Predefined layer for macro run (@lay() becomes AST)
    21  }
    22  
    23  /// True if it is a user-defined layer
    24  
    25  bool isUserDefinedLayer( Layer lay )
    26  {
    27  	return lay!=NoopLayer && lay!=LiftLayer && lay!=ValueLayer && lay!=MacroLayer && lay!=RawMacroLayer;
    28  }
    29  
    30  unittest
    31  {
    32  	assert( !isUserDefinedLayer(NoopLayer) );
    33  	assert( !isUserDefinedLayer(LiftLayer) );
    34  	assert( !isUserDefinedLayer(ValueLayer) );
    35  	assert( !isUserDefinedLayer(MacroLayer) );
    36  	assert( !isUserDefinedLayer(RawMacroLayer) );
    37  	assert( isUserDefinedLayer("@foo") );
    38  }
    39  
    40  /// True if it is macro-like layer that basically generates syntax tree
    41  
    42  bool isASTLayer( Layer lay )
    43  {
    44  	return lay==MacroLayer || lay==RawMacroLayer;
    45  }
    46  
    47  unittest
    48  {
    49  	assert( !isASTLayer(NoopLayer) );
    50  	assert( !isASTLayer(LiftLayer) );
    51  	assert( !isASTLayer(ValueLayer) );
    52  	assert( isASTLayer(MacroLayer) );
    53  	assert( isASTLayer(RawMacroLayer) );
    54  }
    55  
    56  /// True if in the specified layer @lay(...) has no effect and merely produces a syntax tree
    57  
    58  bool isNoLayerChangeLayer( Layer lay )
    59  {
    60  	return lay==RawMacroLayer;
    61  }
    62  
    63  unittest
    64  {
    65  	assert( !isNoLayerChangeLayer(NoopLayer) );
    66  	assert( !isNoLayerChangeLayer(LiftLayer) );
    67  	assert( !isNoLayerChangeLayer(ValueLayer) );
    68  	assert( !isNoLayerChangeLayer(MacroLayer) );
    69  	assert( isNoLayerChangeLayer(RawMacroLayer) );
    70  }
    71  
    72  /// True if do macro expanstion
    73  
    74  bool isMacroLayer( Layer lay )
    75  {
    76  	return lay==MacroLayer || lay==RawMacroLayer;
    77  }
    78  
    79  unittest
    80  {
    81  	assert( !isMacroLayer(NoopLayer) );
    82  	assert( !isMacroLayer(LiftLayer) );
    83  	assert( !isMacroLayer(ValueLayer) );
    84  	assert( isMacroLayer(MacroLayer) );
    85  	assert( isMacroLayer(RawMacroLayer) );
    86  }