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

编译器/解释器

开发平台:

Others

  1. /* MyTokenBuffer.c */
  2. /* Sample replacement for DLGLexer */
  3. /* Shows how to override DLG with your own lexer */
  4. #include <stdio.h>
  5. #include <ctype.h>
  6. #include <stdlib.h>
  7. #include <iostream.h>
  8. #include "config.h" /* include token defs */
  9. #include "mytokens.h" /* include token defs */
  10. #include APARSER_H /* include all the ANTLR yuck */
  11. #include "MyLexer.h" /* define your lexer */
  12. typedef ANTLRCommonToken ANTLRToken;/* use a predefined Token class */
  13. void panic(char *s) {
  14.    cerr << s << 'n';
  15.    exit(5);
  16. }
  17. MyLexer::MyLexer()
  18. {
  19. c = getchar();
  20. }
  21. /* Recognizes Tokens IDENTIFIER and NUMBER */
  22. ANTLRAbstractToken *MyLexer::
  23. getToken()
  24. {
  25. /* we will return a pointer to this next guy */
  26. ANTLRToken *resultToken = new ANTLRToken;
  27. ANTLRChar TokenBuffer[100];
  28. /* This routine will just crash if tokens become
  29.                            more than 99 chars; your code must of course
  30.    gracefully recover/adapt */
  31.    int  index=0;
  32.    while ( c==' ' || c=='n' ) c=getchar();
  33.    if (c==EOF) {resultToken->setType(Eof); return resultToken;}
  34.    if (isdigit(c)) {
  35.       /* Looks like we have ourselves a number token */
  36.       while (isdigit(c)) {
  37.          TokenBuffer[index++]=c;
  38.  c = getchar();
  39.   }
  40.       TokenBuffer[index]='';
  41.       resultToken->setType(NUMBER);
  42.       resultToken->setText(TokenBuffer); /* not exactly swift, unfortunately... */
  43.       return resultToken;
  44.    }
  45.    if (isalpha(c)) {
  46.       /* We have ourselves an IDENTIFIER token */
  47.       while (isalpha(c)) {
  48.          TokenBuffer[index++]=c;
  49.  c = getchar();
  50.   }
  51.       TokenBuffer[index]='';
  52.       resultToken->setType(IDENTIFIER);
  53.       resultToken->setText(TokenBuffer); /* not exactly swift, unfortunately... */
  54.       return resultToken;
  55.    }
  56.    else
  57.       panic("lexer error");
  58.    return NULL;
  59. }