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