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

编译器/解释器

开发平台:

Others

  1. /* This is test.g which tests a simple DLG-based scanner.
  2.  * No garbage collection for tokens since our token can't
  3.  * handle ref counting.
  4.  */
  5. /* ANTLR will assign token type numbers (by creating an enum which you
  6.  * get in tokens.h)
  7.  */
  8. <<
  9. /* user must define ANTLRToken */
  10. typedef char ANTLRChar;
  11. class ANTLRToken : public ANTLRAbstractToken {
  12. protected:
  13.     ANTLRTokenType _type; // what's the token type of the token object
  14.     int _line; // track line info for errors
  15. /* For our simple purposes, a token and a string is enough for
  16.  * our attribute
  17.  */
  18. ANTLRChar _text[30];
  19. public:
  20. ANTLRToken(ANTLRTokenType t, ANTLRChar *s)
  21.         { setType(t); _line = 0; setText(s); }
  22. /* Your derived class MUST have a blank constructor. */
  23.     ANTLRToken()
  24. { setType((ANTLRTokenType)0); _line = 0; setText(""); }
  25. // how to access the token type and line number stuff
  26.     ANTLRTokenType getType() const   { return _type; }
  27.     void setType(ANTLRTokenType t)   { _type = t; }
  28.     virtual int getLine() const      { return _line; }
  29.     void setLine(int line)           { _line = line; }
  30.     //
  31.     //  warning - casting away const in ANTLRToken::getText() const
  32.     //
  33. ANTLRChar *getText() const       { return (ANTLRChar *) _text; }
  34. void setText(const ANTLRChar *s) { strncpy(_text, s, 30); }
  35. /* WARNING WARNING WARNING: you must return a stream of distinct tokens */
  36. /* This function will disappear when I can use templates */
  37. virtual ANTLRAbstractToken *makeToken(ANTLRTokenType tt,
  38.   ANTLRChar *txt,
  39.   int line)
  40. {
  41. ANTLRAbstractToken *t = new ANTLRToken(tt,txt);
  42. t->setLine(line);
  43. return t;
  44. }
  45. };
  46. /* "DLGLexer" must match what you use on DLG command line (-cl);
  47.  * "DLGLexer" is the default.
  48.  */
  49. #include "DLGLexer.h" /* include definition of DLGLexer.
  50.  * This cannot be generated automatically because
  51.  * ANTLR has no idea what you will call this file
  52.  * with the DLG command-line options.
  53.  */
  54. int main()
  55. {
  56. DLGFileInput in(stdin); /* create input stream for DLG to get chars from */
  57. DLGLexer scan(&in); /* create scanner reading from stdin */
  58. ANTLRTokenBuffer pipe(&scan);/* make buffered pipe between lexer&parser */
  59. ANTLRTokenPtr aToken=new ANTLRToken; // create a token to fill in for DLG
  60. scan.setToken(mytoken(aToken));
  61. Expr parser(&pipe); /* create parser of type Expr hooked to scanner */
  62. parser.init(); /* init the parser; prime lookahead etc... */
  63. parser.e(); /* start parsing at rule 'e' of that parser */
  64. return 0;
  65. }
  66. >>
  67. #token "[ tn]+" <<skip();>>
  68. #token Eof "@"
  69. #tokclass My { IDENTIFIER NUMBER }
  70. class Expr { /* Define a grammar class */
  71. e : My My Eof
  72. <<fprintf(stderr, "text is %s,%sn", $1->getText(), $2->getText());>>
  73. ;
  74. }
  75. #token IDENTIFIER "[a-z]+"
  76. #token NUMBER "[0-9]+"