Hex Artifact Content
Not logged in

Artifact 2827b7df74d1df197a586b61058e49f4d15b4a5b:


0000: 2f 2a 2a 0a 20 2a 20 41 75 74 68 6f 72 73 3a 20  /**. * Authors: 
0010: 6b 2e 69 6e 61 62 61 0a 20 2a 20 4c 69 63 65 6e  k.inaba. * Licen
0020: 73 65 3a 20 4e 59 53 4c 20 30 2e 39 39 38 32 20  se: NYSL 0.9982 
0030: 68 74 74 70 3a 2f 2f 77 77 77 2e 6b 6d 6f 6e 6f  http://www.kmono
0040: 73 2e 6e 65 74 2f 6e 79 73 6c 2f 0a 20 2a 0a 20  s.net/nysl/. *. 
0050: 2a 20 45 72 72 6f 72 20 49 6e 66 6f 72 6d 61 74  * Error Informat
0060: 69 6f 6e 20 66 6f 72 20 50 6f 6c 65 6d 79 20 50  ion for Polemy P
0070: 72 6f 67 72 61 6d 6d 69 6e 67 20 4c 61 6e 67 75  rogramming Langu
0080: 61 67 65 0a 20 2a 2f 0a 6d 6f 64 75 6c 65 20 70  age. */.module p
0090: 6f 6c 65 6d 79 2e 66 61 69 6c 75 72 65 3b 0a 69  olemy.failure;.i
00a0: 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 5f 63 6f  mport polemy._co
00b0: 6d 6d 6f 6e 3b 0a 0a 2f 2f 2f 20 52 65 70 72 65  mmon;../// Repre
00c0: 73 65 6e 74 73 20 61 20 70 6f 73 69 74 69 6f 6e  sents a position
00d0: 20 69 6e 20 73 6f 75 72 63 65 20 63 6f 64 65 73   in source codes
00e0: 0a 0a 61 6c 69 61 73 20 69 6d 6d 75 74 61 62 6c  ..alias immutabl
00f0: 65 28 4c 65 78 50 6f 73 69 74 69 6f 6e 5f 74 29  e(LexPosition_t)
0100: 20 4c 65 78 50 6f 73 69 74 69 6f 6e 3b 0a 0a 2f   LexPosition;../
0110: 2f 2f 20 52 65 70 72 65 73 65 6e 74 73 20 61 20  // Represents a 
0120: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 73 6f 75 72  position in sour
0130: 63 65 20 63 6f 64 65 73 0a 0a 63 6c 61 73 73 20  ce codes..class 
0140: 4c 65 78 50 6f 73 69 74 69 6f 6e 5f 74 0a 7b 0a  LexPosition_t.{.
0150: 09 69 6d 6d 75 74 61 62 6c 65 20 73 74 72 69 6e  .immutable strin
0160: 67 20 66 69 6c 65 6e 61 6d 65 3b 20 2f 2f 2f 20  g filename; /// 
0170: 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 6f 75 72  name of the sour
0180: 63 65 20 66 69 6c 65 0a 09 69 6d 6d 75 74 61 62  ce file..immutab
0190: 6c 65 20 69 6e 74 20 20 20 20 6c 69 6e 65 6e 6f  le int    lineno
01a0: 3b 20 20 20 2f 2f 2f 20 31 2d 6f 72 69 67 69 6e  ;   /// 1-origin
01b0: 0a 09 69 6d 6d 75 74 61 62 6c 65 20 69 6e 74 20  ..immutable int 
01c0: 20 20 20 63 6f 6c 75 6d 6e 3b 20 20 20 2f 2f 2f     column;   ///
01d0: 20 31 2d 6f 72 69 67 69 6e 0a 0a 09 6d 69 78 69   1-origin...mixi
01e0: 6e 20 53 69 6d 70 6c 65 43 6c 61 73 73 3b 0a 09  n SimpleClass;..
01f0: 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20  override string 
0200: 74 6f 53 74 72 69 6e 67 28 29 20 63 6f 6e 73 74  toString() const
0210: 0a 09 09 7b 20 72 65 74 75 72 6e 20 73 70 72 69  ...{ return spri
0220: 6e 74 66 21 28 22 25 73 3a 25 64 3a 25 64 22 29  ntf!("%s:%d:%d")
0230: 28 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e  (filename, linen
0240: 6f 2c 20 63 6f 6c 75 6d 6e 29 3b 20 7d 0a 09 73  o, column); }..s
0250: 74 61 74 69 63 20 4c 65 78 50 6f 73 69 74 69 6f  tatic LexPositio
0260: 6e 20 64 75 6d 6d 79 3b 0a 09 73 74 61 74 69 63  n dummy;..static
0270: 20 74 68 69 73 28 29 7b 20 64 75 6d 6d 79 20 3d   this(){ dummy =
0280: 20 6e 65 77 20 4c 65 78 50 6f 73 69 74 69 6f 6e   new LexPosition
0290: 28 22 3c 6e 6f 77 68 65 72 65 3e 22 2c 30 2c 30  ("<nowhere>",0,0
02a0: 29 3b 20 7d 0a 7d 0a 0a 75 6e 69 74 74 65 73 74  ); }.}..unittest
02b0: 0a 7b 0a 09 61 75 74 6f 20 70 20 3d 20 6e 65 77  .{..auto p = new
02c0: 20 4c 65 78 50 6f 73 69 74 69 6f 6e 28 22 68 65   LexPosition("he
02d0: 6c 6c 6f 2e 63 70 70 22 2c 20 31 32 33 2c 20 34  llo.cpp", 123, 4
02e0: 35 29 3b 0a 0a 09 61 73 73 65 72 74 5f 65 71 28  5);...assert_eq(
02f0: 20 70 2e 66 69 6c 65 6e 61 6d 65 2c 20 22 68 65   p.filename, "he
0300: 6c 6c 6f 2e 63 70 70 22 20 29 3b 0a 09 61 73 73  llo.cpp" );..ass
0310: 65 72 74 5f 65 71 28 20 70 2e 6c 69 6e 65 6e 6f  ert_eq( p.lineno
0320: 2c 20 31 32 33 20 29 3b 0a 09 61 73 73 65 72 74  , 123 );..assert
0330: 5f 65 71 28 20 70 2e 63 6f 6c 75 6d 6e 2c 20 34  _eq( p.column, 4
0340: 35 20 29 3b 0a 09 61 73 73 65 72 74 5f 65 71 28  5 );..assert_eq(
0350: 20 74 65 78 74 28 70 29 2c 20 22 68 65 6c 6c 6f   text(p), "hello
0360: 2e 63 70 70 3a 31 32 33 3a 34 35 22 20 29 3b 0a  .cpp:123:45" );.
0370: 0a 09 61 73 73 65 72 74 28 20 21 5f 5f 74 72 61  ..assert( !__tra
0380: 69 74 73 28 63 6f 6d 70 69 6c 65 73 2c 20 6e 65  its(compiles, ne
0390: 77 20 4c 65 78 50 6f 73 69 74 69 6f 6e 29 20 29  w LexPosition) )
03a0: 3b 0a 09 61 73 73 65 72 74 28 20 21 5f 5f 74 72  ;..assert( !__tr
03b0: 61 69 74 73 28 63 6f 6d 70 69 6c 65 73 2c 20 70  aits(compiles, p
03c0: 2e 66 69 6c 65 6e 61 6d 65 3d 22 66 6f 6f 22 29  .filename="foo")
03d0: 20 29 3b 0a 09 61 73 73 65 72 74 28 20 21 5f 5f   );..assert( !__
03e0: 74 72 61 69 74 73 28 63 6f 6d 70 69 6c 65 73 2c  traits(compiles,
03f0: 20 70 2e 6c 69 6e 65 6e 6f 20 20 3d 37 38 39 29   p.lineno  =789)
0400: 20 29 3b 0a 09 61 73 73 65 72 74 28 20 21 5f 5f   );..assert( !__
0410: 74 72 61 69 74 73 28 63 6f 6d 70 69 6c 65 73 2c  traits(compiles,
0420: 20 70 2e 63 6f 6c 75 6d 6e 20 20 3d 32 32 32 29   p.column  =222)
0430: 20 29 3b 0a 0a 09 61 75 74 6f 20 71 20 3d 20 6e   );...auto q = n
0440: 65 77 20 4c 65 78 50 6f 73 69 74 69 6f 6e 28 22  ew LexPosition("
0450: 68 65 6c 6c 6f 2e 63 70 70 22 2c 20 31 32 33 2c  hello.cpp", 123,
0460: 20 34 36 29 3b 0a 09 61 73 73 65 72 74 5f 6c 74   46);..assert_lt
0470: 28 20 70 2c 20 71 20 29 3b 0a 09 61 73 73 65 72  ( p, q );..asser
0480: 74 5f 6e 65 28 20 70 2c 20 71 20 29 3b 0a 7d 0a  t_ne( p, q );.}.
0490: 0a 2f 2a 6d 69 78 69 6e 2a 2f 0a 74 65 6d 70 6c  ./*mixin*/.templ
04a0: 61 74 65 20 45 78 63 65 70 74 69 6f 6e 57 69 74  ate ExceptionWit
04b0: 68 50 6f 73 69 74 69 6f 6e 28 29 0a 7b 0a 09 4c  hPosition().{..L
04c0: 65 78 50 6f 73 69 74 69 6f 6e 20 70 6f 73 3b 0a  exPosition pos;.
04d0: 09 74 68 69 73 28 20 4c 65 78 50 6f 73 69 74 69  .this( LexPositi
04e0: 6f 6e 20 70 6f 73 2c 20 73 74 72 69 6e 67 20 6d  on pos, string m
04f0: 73 67 2c 20 73 74 72 69 6e 67 20 66 69 6c 65 3d  sg, string file=
0500: 6e 75 6c 6c 2c 20 73 69 7a 65 5f 74 20 6c 69 6e  null, size_t lin
0510: 65 3d 30 2c 20 54 68 72 6f 77 61 62 6c 65 20 6e  e=0, Throwable n
0520: 65 78 74 3d 6e 75 6c 6c 20 29 0a 09 7b 0a 09 09  ext=null )..{...
0530: 73 74 72 69 6e 67 20 66 75 6c 6c 6d 73 67 20 3d  string fullmsg =
0540: 20 70 6f 73 20 69 73 20 6e 75 6c 6c 20 3f 20 73   pos is null ? s
0550: 70 72 69 6e 74 66 21 28 22 5c 6e 5b 3f 3f 5d 20  printf!("\n[??] 
0560: 25 73 22 29 28 6d 73 67 29 0a 09 09 20 20 20 20  %s")(msg)...    
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 20 20 20 20 20 20 3a 20 73 70 72 69 6e           : sprin
0590: 74 66 21 28 22 5c 6e 5b 25 73 5d 20 25 73 22 29  tf!("\n[%s] %s")
05a0: 28 70 6f 73 2c 20 6d 73 67 29 3b 0a 09 09 66 6f  (pos, msg);...fo
05b0: 72 28 69 6e 74 20 69 3d 30 3b 20 69 3c 63 61 6c  r(int i=0; i<cal
05c0: 6c 73 74 61 63 6b 5f 70 6f 73 2e 6c 65 6e 67 74  lstack_pos.lengt
05d0: 68 20 7c 7c 20 69 3c 63 61 6c 6c 73 74 61 63 6b  h || i<callstack
05e0: 5f 6d 73 67 2e 6c 65 6e 67 74 68 3b 20 2b 2b 69  _msg.length; ++i
05f0: 29 0a 09 09 7b 0a 09 09 09 4c 65 78 50 6f 73 69  )...{....LexPosi
0600: 74 69 6f 6e 20 70 20 3d 20 28 69 3c 63 61 6c 6c  tion p = (i<call
0610: 73 74 61 63 6b 5f 70 6f 73 2e 6c 65 6e 67 74 68  stack_pos.length
0620: 20 3f 20 63 61 6c 6c 73 74 61 63 6b 5f 70 6f 73   ? callstack_pos
0630: 5b 69 5d 20 3a 20 6e 75 6c 6c 29 3b 0a 09 09 09  [i] : null);....
0640: 73 74 72 69 6e 67 20 20 20 20 20 20 6d 20 3d 20  string      m = 
0650: 28 69 3c 63 61 6c 6c 73 74 61 63 6b 5f 6d 73 67  (i<callstack_msg
0660: 2e 6c 65 6e 67 74 68 20 3f 20 63 61 6c 6c 73 74  .length ? callst
0670: 61 63 6b 5f 6d 73 67 5b 69 5d 20 3a 20 6e 75 6c  ack_msg[i] : nul
0680: 6c 29 3b 0a 09 09 09 66 75 6c 6c 6d 73 67 20 7e  l);....fullmsg ~
0690: 3d 20 70 20 69 73 20 6e 75 6c 6c 20 3f 20 73 70  = p is null ? sp
06a0: 72 69 6e 74 66 21 28 22 5c 6e 5b 3f 3f 5d 20 25  rintf!("\n[??] %
06b0: 73 22 29 28 6d 29 0a 09 09 20 20 20 20 20 20 20  s")(m)...       
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 3a 20 73 70 72 69 6e 74 66 21 28 22 5c 6e    : sprintf!("\n
06e0: 5b 25 73 5d 20 25 73 22 29 28 70 2c 20 6d 29 3b  [%s] %s")(p, m);
06f0: 0a 09 09 7d 0a 09 09 73 75 70 65 72 28 66 75 6c  ...}...super(ful
0700: 6c 6d 73 67 2c 20 66 69 6c 65 2c 20 6c 69 6e 65  lmsg, file, line
0710: 2c 20 6e 65 78 74 29 3b 0a 09 09 74 68 69 73 2e  , next);...this.
0720: 70 6f 73 20 3d 20 70 6f 73 3b 0a 09 7d 0a 09 74  pos = pos;..}..t
0730: 68 69 73 28 20 73 74 72 69 6e 67 20 6d 73 67 2c  his( string msg,
0740: 20 73 74 72 69 6e 67 20 66 69 6c 65 3d 6e 75 6c   string file=nul
0750: 6c 2c 20 73 69 7a 65 5f 74 20 6c 69 6e 65 3d 30  l, size_t line=0
0760: 2c 20 54 68 72 6f 77 61 62 6c 65 20 6e 65 78 74  , Throwable next
0770: 3d 6e 75 6c 6c 20 29 0a 09 7b 0a 09 09 74 68 69  =null )..{...thi
0780: 73 28 6e 75 6c 6c 2c 20 6d 73 67 2c 20 66 69 6c  s(null, msg, fil
0790: 65 2c 20 6c 69 6e 65 2c 20 6e 65 78 74 29 3b 0a  e, line, next);.
07a0: 09 7d 0a 7d 0a 0a 63 6c 61 73 73 20 55 6e 65 78  .}.}..class Unex
07b0: 70 65 63 74 65 64 45 4f 46 20 20 20 20 3a 20 45  pectedEOF    : E
07c0: 78 63 65 70 74 69 6f 6e 20 7b 20 6d 69 78 69 6e  xception { mixin
07d0: 20 45 78 63 65 70 74 69 6f 6e 57 69 74 68 50 6f   ExceptionWithPo
07e0: 73 69 74 69 6f 6e 3b 20 7d 20 2f 2f 2f 20 45 4f  sition; } /// EO
07f0: 46 20 64 75 72 69 6e 67 20 6c 65 78 69 6e 67 2f  F during lexing/
0800: 70 61 72 73 69 6e 67 0a 63 6c 61 73 73 20 4c 65  parsing.class Le
0810: 78 45 78 63 65 70 74 69 6f 6e 20 20 20 20 20 3a  xException     :
0820: 20 45 78 63 65 70 74 69 6f 6e 20 7b 20 6d 69 78   Exception { mix
0830: 69 6e 20 45 78 63 65 70 74 69 6f 6e 57 69 74 68  in ExceptionWith
0840: 50 6f 73 69 74 69 6f 6e 3b 20 7d 20 2f 2f 2f 20  Position; } /// 
0850: 4c 65 78 65 72 20 65 72 72 6f 72 73 0a 63 6c 61  Lexer errors.cla
0860: 73 73 20 50 61 72 73 65 45 78 63 65 70 74 69 6f  ss ParseExceptio
0870: 6e 20 20 20 3a 20 45 78 63 65 70 74 69 6f 6e 20  n   : Exception 
0880: 7b 20 6d 69 78 69 6e 20 45 78 63 65 70 74 69 6f  { mixin Exceptio
0890: 6e 57 69 74 68 50 6f 73 69 74 69 6f 6e 3b 20 7d  nWithPosition; }
08a0: 20 2f 2f 2f 20 50 61 72 73 65 72 20 65 72 72 6f   /// Parser erro
08b0: 72 73 0a 63 6c 61 73 73 20 52 75 6e 74 69 6d 65  rs.class Runtime
08c0: 45 78 63 65 70 74 69 6f 6e 20 3a 20 45 78 63 65  Exception : Exce
08d0: 70 74 69 6f 6e 20 7b 20 6d 69 78 69 6e 20 45 78  ption { mixin Ex
08e0: 63 65 70 74 69 6f 6e 57 69 74 68 50 6f 73 69 74  ceptionWithPosit
08f0: 69 6f 6e 3b 20 7d 20 2f 2f 2f 20 45 76 61 6c 75  ion; } /// Evalu
0900: 61 74 6f 72 20 65 72 72 6f 72 73 0a 0a 2f 2f 2f  ator errors..///
0910: 20 50 65 72 2d 74 68 72 65 61 64 20 63 61 6c 6c   Per-thread call
0920: 20 73 74 61 63 6b 20 6d 61 6e 61 67 65 6d 65 6e   stack managemen
0930: 74 2e 0a 2f 2f 2f 20 54 68 69 73 20 73 63 6f 70  t../// This scop
0940: 65 64 20 63 6c 61 73 73 27 73 20 63 74 6f 72 26  ed class's ctor&
0950: 64 74 6f 72 20 6d 61 69 6e 74 61 69 6e 20 74 68  dtor maintain th
0960: 65 20 63 61 6c 6c 73 74 61 63 6b 2e 0a 2f 2f 2f  e callstack..///
0970: 20 54 4f 44 4f 3a 20 6d 61 6b 65 20 69 74 20 22   TODO: make it "
0980: 70 65 72 2d 65 76 61 6c 75 61 74 6f 72 22 20 21  per-evaluator" !
0990: 21 21 21 21 21 21 21 21 21 21 0a 0a 73 63 6f 70  !!!!!!!!!!..scop
09a0: 65 20 63 6c 61 73 73 20 50 75 73 68 43 61 6c 6c  e class PushCall
09b0: 53 74 61 63 6b 0a 7b 0a 09 74 68 69 73 28 4c 65  Stack.{..this(Le
09c0: 78 50 6f 73 69 74 69 6f 6e 20 70 6f 73 2c 20 73  xPosition pos, s
09d0: 74 72 69 6e 67 20 6d 73 67 29 20 7b 20 63 61 6c  tring msg) { cal
09e0: 6c 73 74 61 63 6b 45 6e 74 65 72 46 75 6e 63 74  lstackEnterFunct
09f0: 69 6f 6e 28 70 6f 73 2c 6d 73 67 29 3b 20 7d 0a  ion(pos,msg); }.
0a00: 09 7e 74 68 69 73 28 29 20 7b 20 63 61 6c 6c 73  .~this() { calls
0a10: 74 61 63 6b 4c 65 61 76 65 46 75 6e 63 74 69 6f  tackLeaveFunctio
0a20: 6e 28 29 3b 20 7d 0a 7d 0a 0a 4c 65 78 50 6f 73  n(); }.}..LexPos
0a30: 69 74 69 6f 6e 5b 5d 20 63 61 6c 6c 73 74 61 63  ition[] callstac
0a40: 6b 5f 70 6f 73 3b 0a 73 74 72 69 6e 67 5b 5d 20  k_pos;.string[] 
0a50: 20 20 20 20 20 63 61 6c 6c 73 74 61 63 6b 5f 6d       callstack_m
0a60: 73 67 3b 0a 0a 70 72 69 76 61 74 65 20 76 6f 69  sg;..private voi
0a70: 64 20 63 61 6c 6c 73 74 61 63 6b 45 6e 74 65 72  d callstackEnter
0a80: 46 75 6e 63 74 69 6f 6e 28 4c 65 78 50 6f 73 69  Function(LexPosi
0a90: 74 69 6f 6e 20 70 6f 73 2c 20 73 74 72 69 6e 67  tion pos, string
0aa0: 20 6d 73 67 29 0a 7b 0a 09 63 61 6c 6c 73 74 61   msg).{..callsta
0ab0: 63 6b 5f 70 6f 73 20 7e 3d 20 70 6f 73 3b 0a 09  ck_pos ~= pos;..
0ac0: 63 61 6c 6c 73 74 61 63 6b 5f 6d 73 67 20 7e 3d  callstack_msg ~=
0ad0: 20 6d 73 67 3b 0a 7d 0a 0a 70 72 69 76 61 74 65   msg;.}..private
0ae0: 20 76 6f 69 64 20 63 61 6c 6c 73 74 61 63 6b 4c   void callstackL
0af0: 65 61 76 65 46 75 6e 63 74 69 6f 6e 28 29 0a 7b  eaveFunction().{
0b00: 0a 09 63 61 6c 6c 73 74 61 63 6b 5f 70 6f 73 2e  ..callstack_pos.
0b10: 6c 65 6e 67 74 68 20 2d 3d 20 31 3b 0a 09 63 61  length -= 1;..ca
0b20: 6c 6c 73 74 61 63 6b 5f 6d 73 67 2e 6c 65 6e 67  llstack_msg.leng
0b30: 74 68 20 2d 3d 20 31 3b 0a 7d 0a                 th -= 1;.}.