]> pd.if.org Git - pccts/blobdiff - testcpp/2/MyLexer.cpp
auto commit for import
[pccts] / testcpp / 2 / MyLexer.cpp
diff --git a/testcpp/2/MyLexer.cpp b/testcpp/2/MyLexer.cpp
new file mode 100755 (executable)
index 0000000..72cb1d7
--- /dev/null
@@ -0,0 +1,76 @@
+/* MyTokenBuffer.c */
+/* Sample replacement for DLGLexer */
+/* Shows how to override DLG with your own lexer */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <iostream.h>
+
+#include "config.h"                                    /* include token defs */
+#include "tokens.h"                                    /* include token defs */
+#include APARSER_H                                     /* include all the ANTLR yuck */
+#include "MyLexer.h"                           /* define your lexer */
+typedef ANTLRCommonToken ANTLRToken;/* use a predefined Token class */
+
+void panic(char *s) {
+   cerr << s << '\n';
+   exit(5);
+}
+
+MyLexer::MyLexer()
+{
+       c = getchar();
+}
+
+/* Recognizes Tokens IDENTIFIER and NUMBER */
+ANTLRAbstractToken *MyLexer::
+getToken()
+{
+       /* we will return a pointer to this next guy */
+       ANTLRToken *resultToken = new ANTLRToken;
+
+       ANTLRChar TokenBuffer[100];
+                                               /* This routine will just crash if tokens become
+                           more than 99 chars; your code must of course
+                                                  gracefully recover/adapt */
+   int  index=0;
+
+   while ( c==' ' || c=='\n' ) c=getchar();
+
+   if (c==EOF) {resultToken->setType(Eof); return resultToken;}
+
+   if (isdigit(c)) {
+      /* Looks like we have ourselves a number token */
+      while (isdigit(c)) {
+         TokenBuffer[index++]=c;
+                c = getchar();
+         }
+      TokenBuffer[index]='\0';
+      
+      resultToken->setType(NUMBER);
+      resultToken->setText(TokenBuffer);
+
+      return resultToken;
+   }
+   
+   if (isalpha(c)) {
+      /* We have ourselves an IDENTIFIER token */
+      while (isalpha(c)) {
+         TokenBuffer[index++]=c;
+                c = getchar();
+         }
+      TokenBuffer[index]='\0';
+
+      resultToken->setType(IDENTIFIER);
+      resultToken->setText(TokenBuffer);
+
+      return resultToken;
+   }
+
+   else
+      panic("lexer error");
+
+   return NULL;
+}
+