CHANGES_FROM_1.31
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:16k
源码类别:

编译器/解释器

开发平台:

Others

  1. CHANGES FROM 1.31
  2. This file contains the migration of PCCTS from 1.31 in the order that
  3. changes were made.  1.32b7 is the last beta before full 1.32.
  4. Terence Parr, Parr Research Corporation 1995.
  5. ======================================================================
  6. 1.32b1
  7. Added Russell Quong to banner, changed banner for output slightly
  8. Fixed it so that you have before / after actions for C++ in class def
  9. Fixed bug in optimizer that made it sometimes forget to set internal
  10.         token pointers.  Only showed up when a {...} was in the "wrong spot".
  11. ======================================================================
  12. 1.32b2
  13. Added fixes by Dave Seidel for PC compilers in 32 bit mode (config.h
  14. and set.h).
  15. ======================================================================
  16. 1.32b3
  17. Fixed hideous bug in code generator for wildcard and for ~token op.
  18. from Dave Seidel
  19.    Added pcnames.bat
  20.    1. in antlr/main.c: change strcasecmp() to stricmp()
  21.    2. in dlg/output.c: use DLEXER_C instead on "DLexer.C"
  22.    3. in h/PBlackBox.h: use <iostream.h> instead of <stream.h>
  23. ======================================================================
  24. 1.32b4
  25. When the -ft option was used, any path prefix screwed up
  26. the gate on the .h files
  27. Fixed yet another bug due to the optimizer.
  28. The exception handling thing was a bit wacko:
  29. a : ( A B )? A B
  30.   | A C
  31.   ;
  32.   exception ...
  33. caused an exception if "A C" was the input.  In other words,
  34. it found that A C didn't match the (A B)? pred and caused
  35. an exception rather than trying the next alt.  All I did
  36. was to change the zzmatch_wsig() macros.
  37. Fixed some problems in gen.c relating to the name of token
  38. class bit sets in the output.
  39. Added the tremendously cool generalized predicate.  For the
  40. moment, I'll give this bried description.
  41. a : <<predicate>>? blah
  42.   | foo
  43.   ;
  44. This implies that (assuming blah and foo are syntactically
  45. ambiguous) "predicate" indicates the semantic validity of
  46. applying "blah".  If "predicate" is false, "foo" is attempted.
  47. Previously, you had to say:
  48. a : <<LA(1)==ID ? predicate : 1>>? ID
  49.   | ID
  50.   ;
  51. Now, you can simply use "predicate" without the ?: operator
  52. if you turn on ANTLR command line option: "-prc on".  This
  53. tells ANTLR to compute that all by itself.  It computes n
  54. tokens of lookahead where LT(n) or LATEXT(n) is the farthest
  55. ahead you look.
  56. If you give a predicate using "-prc on" that is followed
  57. by a construct that can recognize more than one n-sequence,
  58. you will get a warning from ANTLR.  For example,
  59. a : <<isTypeName(LT(1)->getText())>>? (ID|INT)
  60.   ;
  61. This is wrong because the predicate will be applied to INTs
  62. as well as ID's.  You should use this syntax to make
  63. the predicate more specific:
  64. a : (ID)? => <<isTypeName(LT(1)->getText())>>? (ID|INT)
  65.   ;
  66. which says "don't apply the predicate unless ID is the
  67. current lookahead context".
  68. You cannot currently have anything in the "(context)? =>"
  69. except sequences such as:
  70. ( LPAREN ID | LPAREN SCOPE )? => <<pred>>?
  71. I haven't tested this THAT much, but it does work for the
  72. C++ grammar.
  73. ======================================================================
  74. 1.32b5
  75. Added getLine() to the ANTLRTokenBase and DLGBasedToken classes
  76. left line() for backward compatibility.
  77. ----
  78. Removed SORCERER_TRANSFORM from the ast.h stuff.
  79. -------
  80. Fixed bug in code gen of ANTLR such that nested syn preds work more
  81. efficiently now.  The ANTLRTokenBuffer was getting very large
  82. with nested predicates.
  83. ------
  84. Memory leak is now gone from ANTLRTokenBuf; all tokens are deleted.
  85. For backward compatibility reasons, you have to say parser->deleteTokens()
  86. or mytokenbuffer->deleteTokens() but later it will be the default mode.
  87. Say this after the parser is constructed. E.g.,
  88.     ParserBlackBox<DLGLexer, MyParser, ANTLRToken> p(stdin);
  89.     p.parser()->deleteTokens();
  90.     p.parser()->start_symbol();
  91. ==============================
  92. 1.32b6
  93. Changed so that deleteTokens() will do a delete ((ANTLRTokenBase *))
  94. on the ptr.  This gets the virtual destructor.
  95. Fixed some weird things in the C++ header files (a few return types).
  96. Made the AST routines correspond to the book and SORCERER stuff.
  97. New token stuff:  See testcpp/14/test.g
  98. ANTLR accepts a #pragma gc_tokens which says
  99. [1]     Generate label = copy(LT(1)) instead of label=LT(1) for
  100.         all labeled token references.
  101. [2]     User now has to define ANTLRTokenPtr (as a class or a typedef
  102.         to just a pointer) as well as the ANTLRToken class itself.
  103. See the example.
  104. To delete tokens in token buffer, use deleteTokens() message on parser.
  105.         All tokens that fall off the ANTLRTokenBuffer get deleted
  106.         which is what currently happens when deleteTokens() message
  107.         has been sent to token buffer.
  108. We always generate ANTLRTokenPtr instead of 'ANTLRToken *' now.
  109. Then if no pragma set, ANTLR generates a
  110.         class ANTLRToken;
  111.         typedef ANTLRToken *ANTLRTokenPtr;
  112. in each file.
  113. Made a warning for x:rule_ref <<$x>>; still no warning for $i's, however.
  114. class BB {
  115. a : x:b y:A <<$x
  116. $y>>
  117.   ;
  118. b : B;
  119. }
  120. generates
  121. Antlr parser generator   Version 1.32b6   1989-1995
  122. test.g, line 3: error: There are no token ptrs for rule references: '$x'
  123. ===================
  124. 1.32b7:
  125. [With respect to token object garbage collection (GC), 1.32b7
  126.  backtracks from 1.32b6, but results in better and less intrusive GC.
  127.  This is the last beta version before full 1.32.]
  128. BIGGEST CHANGES:
  129. o The "#pragma gc_tokens" is no longer used.
  130. o .C files are now .cpp files (hence, makefiles will have to
  131. be changed; or you can rerun genmk).  This is a good move,
  132. but causes some backward incompatibility problems.  You can
  133. avoid this by changing CPP_FILE_SUFFIX to ".C" in pccts/h/config.h.
  134. o The token object class hierarchy has been flattened to include
  135. only three classes: ANTLRAbstractToken, ANTLRCommonToken, and
  136. ANTLRCommonNoRefCountToken.  The common token now does garbage
  137. collection via ref counting.
  138. o "Smart" pointers are now used for garbage collection.  That is,
  139. ANTLRTokenPtr is used instead of "ANTLRToken *".
  140. o The antlr.1 man page has been cleaned up slightly.
  141. o The SUN C++ compiler now complains less about C++ support code.
  142. o Grammars which subclass ANTLRCommonToken must wrap all token
  143. pointer references in mytoken(token_ptr).  This is the only
  144. serious backward incompatibility.  See below.
  145. MINOR CHANGES:
  146. --------------------------------------------------------
  147. 1 deleteTokens()
  148. The deleteTokens() message to the parser or token buffer has been changed
  149. to one of:
  150.     void noGarbageCollectTokens()   { inputTokens->noGarbageCollectTokens(); }
  151.     void garbageCollectTokens()     { inputTokens->garbageCollectTokens(); }
  152. The token buffer deletes all non-referenced tokens by default now.
  153. --------------------------------------------------------
  154. 2 makeToken()
  155. The makeToken() message returns a new type.  The function should look
  156. like:
  157.     virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt,
  158.                                           ANTLRChar *txt,
  159.                                           int line)
  160.     {
  161.         ANTLRAbstractToken *t = new ANTLRCommonToken(tt,txt);
  162.         t->setLine(line);
  163.         return t;
  164.     }
  165. --------------------------------------------------------
  166. 3 TokenType
  167. Changed TokenType-> ANTLRTokenType  (often forces changes in AST defs due
  168. to #[] constructor called to AST(tokentype, string)).
  169. --------------------------------------------------------
  170. 4 AST()
  171. You must define AST(ANTLRTokenPtr t) now in your AST class definition.
  172. You might also have to include ATokPtr.h above the definition; e.g.,
  173. if AST is defined in a separate file, such as AST.h, it's a good idea
  174. to include ATOKPTR_H (ATokPtr.h).  For example,
  175. #include ATOKPTR_H
  176. class AST : public ASTBase {
  177. protected:
  178.     ANTLRTokenPtr token;
  179. public:
  180.     AST(ANTLRTokenPtr t) { token = t; }
  181.     void preorder_action() {
  182.         char *s = token->getText();
  183.         printf(" %s", s);
  184.     }
  185. };
  186. Note the use of smart pointers rather than "ANTLRToken *".
  187. --------------------------------------------------------
  188. 5 SUN C++
  189. From robertb@oakhill.sps.mot.com Bob Bailey. Changed ANTLR C++ output
  190. to avoid an error in Sun C++ 3.0.1.  Made "public" return value
  191. structs created to hold multiple return values public.
  192. --------------------------------------------------------
  193. 6 genmk
  194. Fixed genmk so that target List.* is not included anymore.  It's
  195. called SList.* anyway.
  196. --------------------------------------------------------
  197. 7 r vs n
  198. Scott Vorthmann <vorth@cmu.edu> fixed antlr.g in ANTLR so that r
  199. is allowed as the return character as well as n.
  200. --------------------------------------------------------
  201. 8 Exceptions
  202. Bug in exceptions attached to labeled token/tokclass references.  Didn't gen
  203. code for exceptions.  This didn't work:
  204. a : "help" x:ID
  205.   ;
  206.         exception[x]
  207.         catch MismatchedToken : <<printf("eh?n");>>
  208. Now ANTLR generates (which is kinda big, but necessary):
  209.         if ( !_match_wsig(ID) ) {
  210.                 if ( guessing ) goto fail;
  211.                 _signal=MismatchedToken;
  212.                 switch ( _signal ) {
  213.                 case MismatchedToken :
  214.                         printf("eh?n");
  215.                         _signal = NoSignal;
  216.                         break;
  217.                 default :
  218.                         goto _handler;
  219.                 }
  220.         }
  221. which implies that you can recover and continue parsing after a missing/bad
  222. token reference.
  223. --------------------------------------------------------
  224. 9 genmk
  225. genmk now correctly uses config file for CPP_FILE_SUFFIX stuff.
  226. --------------------------------------------------------
  227. 10 general cleanup / PURIFY
  228. Anthony Green <green@vizbiz.com> suggested a bunch of good general
  229. clean up things for the code; he also suggested a few things to
  230. help out the "PURIFY" memory allocation checker.
  231. --------------------------------------------------------
  232. 11 $-variable references.
  233. Manuel ORNATO indicated that a $-variable outside of a rule caused
  234. ANTLR to crash.  I fixed this.
  235. 12 Tom Moog suggestion
  236. Fail action of semantic predicate needs "{}" envelope.  FIXED.
  237. 13 references to LT(1).
  238. I have enclosed all assignments such as:
  239.              _t22 = (ANTLRTokenPtr)LT(1);
  240. in "if ( !guessing )" so that during backtracking the reference count
  241. for token objects is not increased.
  242. TOKEN OBJECT GARBAGE COLLECTION
  243. 1 INTRODUCTION
  244. The class ANTLRCommonToken is now garbaged collected through a "smart"
  245. pointer called ANTLRTokenPtr using reference counting.  Any token
  246. object not referenced by your grammar actions is destroyed by the
  247. ANTLRTokenBuffer when it must make room for more token objects.
  248. Referenced tokens are then destroyed in your parser when local
  249. ANTLRTokenPtr objects are deleted.  For example,
  250. a : label:ID ;
  251. would be converted to something like:
  252. void yourclass::a(void)
  253. {
  254. zzRULE;
  255. ANTLRTokenPtr label=NULL; // used to be ANTLRToken *label;
  256.         zzmatch(ID);
  257.         label = (ANTLRTokenPtr)LT(1);
  258. consume();
  259. ...
  260. }
  261. When the "label" object is destroyed (it's just a pointer to your
  262. input token object LT(1)), it decrements the reference count on the
  263. object created for the ID.  If the count goes to zero, the object
  264. pointed by label is deleted.
  265. To correctly manage the garbage collection, you should use
  266. ANTLRTokenPtr instead of "ANTLRToken *".  Most ANTLR support code
  267. (visible to the user) has been modified to use the smart pointers.
  268. ***************************************************************
  269. Remember that any local objects that you create are not deleted when a
  270. lonjmp() is executed.  Unfortunately, the syntactic predicates (...)?
  271. use setjmp()/longjmp().  There are some situations when a few tokens
  272. will "leak".
  273. ***************************************************************
  274. 2 DETAILS
  275. o The default is to perform token object garbage collection.
  276. You may use parser->noGarbageCollectTokens() to turn off
  277. garbage collection.
  278. o The type ANTLRTokenPtr is always defined now (automatically).
  279. If you do not wish to use smart pointers, you will have to
  280. redefined ANTLRTokenPtr by subclassing, changing the header
  281. file or changing ANTLR's code generation (easy enough to
  282. do in gen.c).
  283. o If you don't use ParserBlackBox, the new initialization sequence is:
  284.     ANTLRTokenPtr aToken = new ANTLRToken;
  285.     scan.setToken(mytoken(aToken));
  286. where mytoken(aToken) gets an ANTLRToken * from the smart pointer.
  287. o Define C++ preprocessor symbol DBG_REFCOUNTTOKEN to see a bunch of
  288. debugging stuff for reference counting if you suspect something.
  289. 3 WHY DO I HAVE TO TYPECAST ALL MY TOKEN POINTERS NOW??????
  290. If you subclass ANTLRCommonToken and then attempt to refer to one of
  291. your token members via a token pointer in your grammar actions, the
  292. C++ compiler will complain that your token object does not have that
  293. member.  For example, if you used to do this
  294. <<
  295. class ANTLRToken : public ANTLRCommonToken {
  296.         int muck;
  297. ...
  298. };
  299. >>
  300. class Foo {
  301. a : t:ID << t->muck = ...; >> ;
  302. }
  303. Now, you must do change the t->muck reference to:
  304. a : t:ID << mytoken(t)->muck = ...; >> ;
  305. in order to downcast 't' to be an "ANTLRToken *" not the
  306. "ANTLRAbstractToken *" resulting from ANTLRTokenPtr::operator->().
  307. The macro is defined as:
  308. /*
  309.  * Since you cannot redefine operator->() to return one of the user's
  310.  * token object types, we must down cast.  This is a drag.  Here's
  311.  * a macro that helps.  template: "mytoken(a-smart-ptr)->myfield".
  312.  */
  313. #define mytoken(tp) ((ANTLRToken *)(tp.operator->()))
  314. You have to use macro mytoken(grammar-label) now because smart
  315. pointers are not specific to a parser's token objects.  In other
  316. words, the ANTLRTokenPtr class has a pointer to a generic
  317. ANTLRAbstractToken not your ANTLRToken; the ANTLR support code must
  318. use smart pointers too, but be able to work with any kind of
  319. ANTLRToken.  Sorry about this, but it's C++'s fault not mine.  Some
  320. nebulous future version of the C++ compilers should obviate the need
  321. to downcast smart pointers with runtime type checking (and by allowing
  322. different return type of overridden functions).
  323. A way to have backward compatible code is to shut off the token object
  324. garbage collection; i.e., use parser->noGarbageCollectTokens() and
  325. change the definition of ANTLRTokenPtr (that's why you get source code
  326. <wink>).
  327. PARSER EXCEPTION HANDLING
  328. I've noticed some weird stuff with the exception handling.  I intend
  329. to give this top priority for the "book release" of ANTLR.
  330. ==========
  331. 1.32 Full Release
  332. o Changed Token class hierarchy to be (Thanks to Tom Moog):
  333.         ANTLRAbstractToken
  334.           ANTLRRefCountToken
  335.              ANTLRCommonToken
  336.           ANTLRNoRefCountCommonToken
  337. o Added virtual panic() to ANTLRAbstractToken.  Made ANTLRParser::panic()
  338. virtual also.
  339. o Cleaned up the dup() stuff in AST hierarchy to use shallowCopy() to
  340. make node copies.  John Farr at Medtronic suggested this.  I.e.,
  341. if you want to use dup() with either ANTLR or SORCERER or -transform
  342. mode with SORCERER, you must defined shallowCopy() as:
  343. virtual PCCTS_AST *shallowCopy()
  344. {
  345.     return new AST;
  346.     p->setDown(NULL);
  347.     p->setRight(NULL);
  348.     return p;
  349. }
  350. or
  351. virtual PCCTS_AST *shallowCopy()
  352. {
  353.     return new AST(*this);
  354. }
  355. if you have defined a copy constructor such as
  356. AST(const AST &t) // shallow copy constructor
  357. {
  358. token = t.token;
  359. iconst = t.iconst;
  360. setDown(NULL);
  361. setRight(NULL);
  362. }
  363. o Added a warning with -CC and -gk are used together.  This is broken,
  364. hence a warning is appropriate.
  365. o Added warning when #-stuff is used w/o -gt option.
  366. o Updated MPW installation.
  367. o "Miller, Philip W." <MILLERPW@f1groups.fsd.jhuapl.edu> suggested
  368. that genmk be use RENAME_OBJ_FLAG RENAME_EXE_FLAG instead of
  369. hardcoding "-o" in genmk.c.
  370. o made all exit() calls use EXIT_SUCCESS or EXIT_FAILURE.
  371. ===========================================================================
  372. 1.33
  373. EXIT_FAILURE and EXIT_SUCCESS were not always defined.  I had to modify
  374. a bunch of files to use PCCTS_EXIT_XXX, which forces a new version.  Sorry
  375. about that.