Hex Artifact Content
Not logged in

Artifact e37c83f645af4d82b55a33bb252fdb0194ef1a77:


0000: 2f 2a 2a 0d 0a 20 2a 20 41 75 74 68 6f 72 73 3a  /**.. * Authors:
0010: 20 6b 2e 69 6e 61 62 61 0d 0a 20 2a 20 4c 69 63   k.inaba.. * Lic
0020: 65 6e 73 65 3a 20 4e 59 53 4c 20 30 2e 39 39 38  ense: NYSL 0.998
0030: 32 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6b 6d 6f  2 http://www.kmo
0040: 6e 6f 73 2e 6e 65 74 2f 6e 79 73 6c 2f 0d 0a 20  nos.net/nysl/.. 
0050: 2a 0d 0a 20 2a 20 44 65 66 69 6e 69 74 69 6f 6e  *.. * Definition
0060: 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 72 65   of constants re
0070: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6c 61 79  lated to the lay
0080: 65 72 73 2e 0d 0a 20 2a 2f 0d 0a 6d 6f 64 75 6c  ers... */..modul
0090: 65 20 70 6f 6c 65 6d 79 2e 6c 61 79 65 72 3b 0d  e polemy.layer;.
00a0: 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 5f  .import polemy._
00b0: 63 6f 6d 6d 6f 6e 3b 0d 0a 0d 0a 2f 2f 2f 20 54  common;..../// T
00c0: 79 70 65 20 66 6f 72 20 74 68 65 20 6c 61 79 65  ype for the laye
00d0: 72 20 49 44 0d 0a 0d 0a 61 6c 69 61 73 20 73 74  r ID....alias st
00e0: 72 69 6e 67 20 4c 61 79 65 72 3b 0d 0a 0d 0a 65  ring Layer;....e
00f0: 6e 75 6d 20 3a 20 4c 61 79 65 72 0d 0a 7b 0d 0a  num : Layer..{..
0100: 09 4c 69 66 74 4c 61 79 65 72 20 20 20 20 20 3d  .LiftLayer     =
0110: 20 22 28 6c 69 66 74 29 22 2c 20 20 20 20 20 2f   "(lift)",     /
0120: 2f 2f 20 50 72 65 64 65 66 69 6e 65 64 20 6c 61  // Predefined la
0130: 79 65 72 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  yer for storing 
0140: 6c 69 66 74 20 66 75 6e 63 74 69 6f 6e 73 0d 0a  lift functions..
0150: 09 4e 6f 6f 70 4c 61 79 65 72 20 20 20 20 20 3d  .NoopLayer     =
0160: 20 22 28 6e 6f 6f 70 29 22 2c 20 20 20 20 20 2f   "(noop)",     /
0170: 2f 2f 20 50 72 65 64 65 66 69 6e 65 64 20 6c 61  // Predefined la
0180: 79 65 72 20 66 6f 72 20 6a 75 73 74 20 61 6c 6c  yer for just all
0190: 6f 63 61 74 69 6e 67 20 61 20 73 6c 6f 74 20 66  ocating a slot f
01a0: 6f 72 20 74 61 62 6c 65 0d 0a 09 56 61 6c 75 65  or table...Value
01b0: 4c 61 79 65 72 20 20 20 20 3d 20 22 40 76 61 6c  Layer    = "@val
01c0: 75 65 22 2c 20 20 20 20 20 2f 2f 2f 20 50 72 65  ue",     /// Pre
01d0: 64 65 66 69 6e 65 64 20 6c 61 79 65 72 20 66 6f  defined layer fo
01e0: 72 20 6e 6f 72 6d 61 6c 20 72 75 6e 0d 0a 09 4d  r normal run...M
01f0: 61 63 72 6f 4c 61 79 65 72 20 20 20 20 3d 20 22  acroLayer    = "
0200: 40 6d 61 63 72 6f 22 2c 20 20 20 20 20 2f 2f 2f  @macro",     ///
0210: 20 50 72 65 64 65 66 69 6e 65 64 20 6c 61 79 65   Predefined laye
0220: 72 20 66 6f 72 20 6d 61 63 72 6f 20 72 75 6e 20  r for macro run 
0230: 28 40 6c 61 79 28 29 20 63 68 61 6e 67 65 73 20  (@lay() changes 
0240: 6c 61 79 65 72 29 0d 0a 09 52 61 77 4d 61 63 72  layer)...RawMacr
0250: 6f 4c 61 79 65 72 20 3d 20 22 28 72 61 77 6d 61  oLayer = "(rawma
0260: 63 72 6f 29 22 2c 20 2f 2f 2f 20 50 72 65 64 65  cro)", /// Prede
0270: 66 69 6e 65 64 20 6c 61 79 65 72 20 66 6f 72 20  fined layer for 
0280: 6d 61 63 72 6f 20 72 75 6e 20 28 40 6c 61 79 28  macro run (@lay(
0290: 29 20 62 65 63 6f 6d 65 73 20 41 53 54 29 0d 0a  ) becomes AST)..
02a0: 7d 0d 0a 0d 0a 2f 2f 2f 20 54 72 75 65 20 69 66  }..../// True if
02b0: 20 69 74 20 69 73 20 61 20 75 73 65 72 2d 64 65   it is a user-de
02c0: 66 69 6e 65 64 20 6c 61 79 65 72 0d 0a 0d 0a 62  fined layer....b
02d0: 6f 6f 6c 20 69 73 55 73 65 72 44 65 66 69 6e 65  ool isUserDefine
02e0: 64 4c 61 79 65 72 28 20 4c 61 79 65 72 20 6c 61  dLayer( Layer la
02f0: 79 20 29 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20  y )..{...return 
0300: 6c 61 79 21 3d 4e 6f 6f 70 4c 61 79 65 72 20 26  lay!=NoopLayer &
0310: 26 20 6c 61 79 21 3d 4c 69 66 74 4c 61 79 65 72  & lay!=LiftLayer
0320: 20 26 26 20 6c 61 79 21 3d 56 61 6c 75 65 4c 61   && lay!=ValueLa
0330: 79 65 72 20 26 26 20 6c 61 79 21 3d 4d 61 63 72  yer && lay!=Macr
0340: 6f 4c 61 79 65 72 20 26 26 20 6c 61 79 21 3d 52  oLayer && lay!=R
0350: 61 77 4d 61 63 72 6f 4c 61 79 65 72 3b 0d 0a 7d  awMacroLayer;..}
0360: 0d 0a 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d  ....unittest..{.
0370: 0a 09 61 73 73 65 72 74 28 20 21 69 73 55 73 65  ..assert( !isUse
0380: 72 44 65 66 69 6e 65 64 4c 61 79 65 72 28 4e 6f  rDefinedLayer(No
0390: 6f 70 4c 61 79 65 72 29 20 29 3b 0d 0a 09 61 73  opLayer) );...as
03a0: 73 65 72 74 28 20 21 69 73 55 73 65 72 44 65 66  sert( !isUserDef
03b0: 69 6e 65 64 4c 61 79 65 72 28 4c 69 66 74 4c 61  inedLayer(LiftLa
03c0: 79 65 72 29 20 29 3b 0d 0a 09 61 73 73 65 72 74  yer) );...assert
03d0: 28 20 21 69 73 55 73 65 72 44 65 66 69 6e 65 64  ( !isUserDefined
03e0: 4c 61 79 65 72 28 56 61 6c 75 65 4c 61 79 65 72  Layer(ValueLayer
03f0: 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 21  ) );...assert( !
0400: 69 73 55 73 65 72 44 65 66 69 6e 65 64 4c 61 79  isUserDefinedLay
0410: 65 72 28 4d 61 63 72 6f 4c 61 79 65 72 29 20 29  er(MacroLayer) )
0420: 3b 0d 0a 09 61 73 73 65 72 74 28 20 21 69 73 55  ;...assert( !isU
0430: 73 65 72 44 65 66 69 6e 65 64 4c 61 79 65 72 28  serDefinedLayer(
0440: 52 61 77 4d 61 63 72 6f 4c 61 79 65 72 29 20 29  RawMacroLayer) )
0450: 3b 0d 0a 09 61 73 73 65 72 74 28 20 69 73 55 73  ;...assert( isUs
0460: 65 72 44 65 66 69 6e 65 64 4c 61 79 65 72 28 22  erDefinedLayer("
0470: 40 66 6f 6f 22 29 20 29 3b 0d 0a 7d 0d 0a 0d 0a  @foo") );..}....
0480: 2f 2f 2f 20 54 72 75 65 20 69 66 20 69 74 20 69  /// True if it i
0490: 73 20 6d 61 63 72 6f 2d 6c 69 6b 65 20 6c 61 79  s macro-like lay
04a0: 65 72 20 74 68 61 74 20 62 61 73 69 63 61 6c 6c  er that basicall
04b0: 79 20 67 65 6e 65 72 61 74 65 73 20 73 79 6e 74  y generates synt
04c0: 61 78 20 74 72 65 65 0d 0a 0d 0a 62 6f 6f 6c 20  ax tree....bool 
04d0: 69 73 41 53 54 4c 61 79 65 72 28 20 4c 61 79 65  isASTLayer( Laye
04e0: 72 20 6c 61 79 20 29 0d 0a 7b 0d 0a 09 72 65 74  r lay )..{...ret
04f0: 75 72 6e 20 6c 61 79 3d 3d 4d 61 63 72 6f 4c 61  urn lay==MacroLa
0500: 79 65 72 20 7c 7c 20 6c 61 79 3d 3d 52 61 77 4d  yer || lay==RawM
0510: 61 63 72 6f 4c 61 79 65 72 3b 0d 0a 7d 0d 0a 0d  acroLayer;..}...
0520: 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a 09 61  .unittest..{...a
0530: 73 73 65 72 74 28 20 21 69 73 41 53 54 4c 61 79  ssert( !isASTLay
0540: 65 72 28 4e 6f 6f 70 4c 61 79 65 72 29 20 29 3b  er(NoopLayer) );
0550: 0d 0a 09 61 73 73 65 72 74 28 20 21 69 73 41 53  ...assert( !isAS
0560: 54 4c 61 79 65 72 28 4c 69 66 74 4c 61 79 65 72  TLayer(LiftLayer
0570: 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 21  ) );...assert( !
0580: 69 73 41 53 54 4c 61 79 65 72 28 56 61 6c 75 65  isASTLayer(Value
0590: 4c 61 79 65 72 29 20 29 3b 0d 0a 09 61 73 73 65  Layer) );...asse
05a0: 72 74 28 20 69 73 41 53 54 4c 61 79 65 72 28 4d  rt( isASTLayer(M
05b0: 61 63 72 6f 4c 61 79 65 72 29 20 29 3b 0d 0a 09  acroLayer) );...
05c0: 61 73 73 65 72 74 28 20 69 73 41 53 54 4c 61 79  assert( isASTLay
05d0: 65 72 28 52 61 77 4d 61 63 72 6f 4c 61 79 65 72  er(RawMacroLayer
05e0: 29 20 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2f 2f 20 54  ) );..}..../// T
05f0: 72 75 65 20 69 66 20 69 6e 20 74 68 65 20 73 70  rue if in the sp
0600: 65 63 69 66 69 65 64 20 6c 61 79 65 72 20 40 6c  ecified layer @l
0610: 61 79 28 2e 2e 2e 29 20 68 61 73 20 6e 6f 20 65  ay(...) has no e
0620: 66 66 65 63 74 20 61 6e 64 20 6d 65 72 65 6c 79  ffect and merely
0630: 20 70 72 6f 64 75 63 65 73 20 61 20 73 79 6e 74   produces a synt
0640: 61 78 20 74 72 65 65 0d 0a 0d 0a 62 6f 6f 6c 20  ax tree....bool 
0650: 69 73 4e 6f 4c 61 79 65 72 43 68 61 6e 67 65 4c  isNoLayerChangeL
0660: 61 79 65 72 28 20 4c 61 79 65 72 20 6c 61 79 20  ayer( Layer lay 
0670: 29 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 6c 61  )..{...return la
0680: 79 3d 3d 52 61 77 4d 61 63 72 6f 4c 61 79 65 72  y==RawMacroLayer
0690: 3b 0d 0a 7d 0d 0a 0d 0a 75 6e 69 74 74 65 73 74  ;..}....unittest
06a0: 0d 0a 7b 0d 0a 09 61 73 73 65 72 74 28 20 21 69  ..{...assert( !i
06b0: 73 4e 6f 4c 61 79 65 72 43 68 61 6e 67 65 4c 61  sNoLayerChangeLa
06c0: 79 65 72 28 4e 6f 6f 70 4c 61 79 65 72 29 20 29  yer(NoopLayer) )
06d0: 3b 0d 0a 09 61 73 73 65 72 74 28 20 21 69 73 4e  ;...assert( !isN
06e0: 6f 4c 61 79 65 72 43 68 61 6e 67 65 4c 61 79 65  oLayerChangeLaye
06f0: 72 28 4c 69 66 74 4c 61 79 65 72 29 20 29 3b 0d  r(LiftLayer) );.
0700: 0a 09 61 73 73 65 72 74 28 20 21 69 73 4e 6f 4c  ..assert( !isNoL
0710: 61 79 65 72 43 68 61 6e 67 65 4c 61 79 65 72 28  ayerChangeLayer(
0720: 56 61 6c 75 65 4c 61 79 65 72 29 20 29 3b 0d 0a  ValueLayer) );..
0730: 09 61 73 73 65 72 74 28 20 21 69 73 4e 6f 4c 61  .assert( !isNoLa
0740: 79 65 72 43 68 61 6e 67 65 4c 61 79 65 72 28 4d  yerChangeLayer(M
0750: 61 63 72 6f 4c 61 79 65 72 29 20 29 3b 0d 0a 09  acroLayer) );...
0760: 61 73 73 65 72 74 28 20 69 73 4e 6f 4c 61 79 65  assert( isNoLaye
0770: 72 43 68 61 6e 67 65 4c 61 79 65 72 28 52 61 77  rChangeLayer(Raw
0780: 4d 61 63 72 6f 4c 61 79 65 72 29 20 29 3b 0d 0a  MacroLayer) );..
0790: 7d 0d 0a 0d 0a 2f 2f 2f 20 54 72 75 65 20 69 66  }..../// True if
07a0: 20 64 6f 20 6d 61 63 72 6f 20 65 78 70 61 6e 73   do macro expans
07b0: 74 69 6f 6e 0d 0a 0d 0a 62 6f 6f 6c 20 69 73 4d  tion....bool isM
07c0: 61 63 72 6f 4c 61 79 65 72 28 20 4c 61 79 65 72  acroLayer( Layer
07d0: 20 6c 61 79 20 29 0d 0a 7b 0d 0a 09 72 65 74 75   lay )..{...retu
07e0: 72 6e 20 6c 61 79 3d 3d 4d 61 63 72 6f 4c 61 79  rn lay==MacroLay
07f0: 65 72 20 7c 7c 20 6c 61 79 3d 3d 52 61 77 4d 61  er || lay==RawMa
0800: 63 72 6f 4c 61 79 65 72 3b 0d 0a 7d 0d 0a 0d 0a  croLayer;..}....
0810: 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a 09 61 73  unittest..{...as
0820: 73 65 72 74 28 20 21 69 73 4d 61 63 72 6f 4c 61  sert( !isMacroLa
0830: 79 65 72 28 4e 6f 6f 70 4c 61 79 65 72 29 20 29  yer(NoopLayer) )
0840: 3b 0d 0a 09 61 73 73 65 72 74 28 20 21 69 73 4d  ;...assert( !isM
0850: 61 63 72 6f 4c 61 79 65 72 28 4c 69 66 74 4c 61  acroLayer(LiftLa
0860: 79 65 72 29 20 29 3b 0d 0a 09 61 73 73 65 72 74  yer) );...assert
0870: 28 20 21 69 73 4d 61 63 72 6f 4c 61 79 65 72 28  ( !isMacroLayer(
0880: 56 61 6c 75 65 4c 61 79 65 72 29 20 29 3b 0d 0a  ValueLayer) );..
0890: 09 61 73 73 65 72 74 28 20 69 73 4d 61 63 72 6f  .assert( isMacro
08a0: 4c 61 79 65 72 28 4d 61 63 72 6f 4c 61 79 65 72  Layer(MacroLayer
08b0: 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 69  ) );...assert( i
08c0: 73 4d 61 63 72 6f 4c 61 79 65 72 28 52 61 77 4d  sMacroLayer(RawM
08d0: 61 63 72 6f 4c 61 79 65 72 29 20 29 3b 0d 0a 7d  acroLayer) );..}
08e0: 0d 0a                                            ..