Kaynağa Gözat

add code for Token and init Lexer

AbdeFaiz 5 ay önce
ebeveyn
işleme
e11d7dbbc0
5 değiştirilmiş dosya ile 111 ekleme ve 39 silme
  1. 9 0
      Makefile
  2. 15 0
      src/Lexer.cpp
  3. 7 6
      src/Token.cpp
  4. 69 33
      src/Token.hpp
  5. 11 0
      src/main.cpp

+ 9 - 0
Makefile

@@ -0,0 +1,9 @@
+CC = g++
+FLAGS = -Wall
+
+test.out: src/main.cpp
+	$(CC) $(FLAGS) $^ -o $@
+	./$@
+
+clean:
+	rm -f test *.o

+ 15 - 0
src/Lexer.cpp

@@ -0,0 +1,15 @@
+#include "Lexer.hpp"
+
+Lexer::Lexer():curChar(' '), curPos(-1){};
+
+void Lexer::nextChar() {
+  return;
+}
+
+void Lexer::peek() {
+  return;
+}
+
+Token Lexer::getToken() {
+  return Token("END_OF_FILE", END_OF_FILE);
+}

+ 7 - 6
src/Token.cpp

@@ -1,10 +1,11 @@
 #include "Token.hpp"
 
-Token::Token(string tokenText, enum TokenType tokenKind){
-  this->text = tokenText;
-  this->kind = tokenKind;
-}
+Token::Token(string tokenText, TokenType tokenKind):text(tokenText), kind(tokenKind) { }
 
-Token::checkIfKeyword(string tokenText){
-  
+TokenType checkIfKeyword(string &tokenText){
+  TokenType token_type = token_type_from_name(tokenText);
+  int token_value = static_cast<int>(token_type);
+  if (100 < token_value && token_value < 200)
+    return token_type;
+  return TokenType::IDENT;
 }

+ 69 - 33
src/Token.hpp

@@ -1,7 +1,7 @@
 #include <string>
 using std::string;
 
-enum class TokenType {
+enum TokenType {
   END_OF_FILE = -1,
   NEWLINE = 0,
   NUMBER = 1,
@@ -30,49 +30,85 @@ enum class TokenType {
   LT = 208,
   LTEQ = 209,
   GT = 210,
-  GTEQ = 211
+  GTEQ = 211,
+  // UNKOWN
+  UNKOWN = 999
 };
 
 string token_name(TokenType t) {
   switch (t) {
-      case TokenType::END_OF_FILE: return "END_OF_FILE";
-      case TokenType::NEWLINE: return "NEWLINE";
-      case TokenType::NUMBER: return "NUMBER";
-      case TokenType::IDENT: return "IDENT";
-      case TokenType::STRING: return "STRING";
+      case END_OF_FILE: return "END_OF_FILE";
+      case NEWLINE: return "NEWLINE";
+      case NUMBER: return "NUMBER";
+      case IDENT: return "IDENT";
+      case STRING: return "STRING";
       // Keywords
-      case TokenType::LABEL: return "LABEL";
-      case TokenType::GOTO: return "GOTO";
-      case TokenType::PRINT: return "PRINT";
-      case TokenType::INPUT: return "INPUT";
-      case TokenType::LET: return "LET";
-      case TokenType::IF: return "IF";
-      case TokenType::THEN: return "THEN";
-      case TokenType::ENDIF: return "ENDIF";
-      case TokenType::WHILE: return "WHILE";
-      case TokenType::REPEAT: return "REPEAT";
-      case TokenType::ENDWHILE: return "ENDWHILE";
+      case LABEL: return "LABEL";
+      case GOTO: return "GOTO";
+      case PRINT: return "PRINT";
+      case INPUT: return "INPUT";
+      case LET: return "LET";
+      case IF: return "IF";
+      case THEN: return "THEN";
+      case ENDIF: return "ENDIF";
+      case WHILE: return "WHILE";
+      case REPEAT: return "REPEAT";
+      case ENDWHILE: return "ENDWHILE";
       // Operators
-      case TokenType::EQ: return "EQ";
-      case TokenType::PLUS: return "PLUS";
-      case TokenType::MINUS: return "MINUS";
-      case TokenType::ASTERISK: return "ASTERISK";
-      case TokenType::SLASH: return "SLASH";
-      case TokenType::EQEQ: return "EQEQ";
-      case TokenType::NOTEQ: return "NOTEQ";
-      case TokenType::LT: return "LT";
-      case TokenType::LTEQ: return "LTEQ";
-      case TokenType::GT: return "GT";
-      case TokenType::GTEQ: return "GTEQ";
-      default: return "Unknown";
+      case EQ: return "EQ";
+      case PLUS: return "PLUS";
+      case MINUS: return "MINUS";
+      case ASTERISK: return "ASTERISK";
+      case SLASH: return "SLASH";
+      case EQEQ: return "EQEQ";
+      case NOTEQ: return "NOTEQ";
+      case LT: return "LT";
+      case LTEQ: return "LTEQ";
+      case GT: return "GT";
+      case GTEQ: return "GTEQ";
+      default: return "UNKOWN";
   }
 }
 
+TokenType token_type_from_name(const string &name) {
+  if (name == "END_OF_FILE") return END_OF_FILE;
+  if (name == "NEWLINE") return NEWLINE;
+  if (name == "NUMBER") return NUMBER;
+  if (name == "IDENT") return IDENT;
+  if (name == "STRING") return STRING;
+  // Keywords
+  if (name == "LABEL") return LABEL;
+  if (name == "GOTO") return GOTO;
+  if (name == "PRINT") return PRINT;
+  if (name == "INPUT") return INPUT;
+  if (name == "LET") return LET;
+  if (name == "IF") return IF;
+  if (name == "THEN") return THEN;
+  if (name == "ENDIF") return ENDIF;
+  if (name == "WHILE") return WHILE;
+  if (name == "REPEAT") return REPEAT;
+  if (name == "ENDWHILE") return ENDWHILE;
+  // Operators
+  if (name == "EQ") return EQ;
+  if (name == "PLUS") return PLUS;
+  if (name == "MINUS") return MINUS;
+  if (name == "ASTERISK") return ASTERISK;
+  if (name == "SLASH") return SLASH;
+  if (name == "EQEQ") return EQEQ;
+  if (name == "NOTEQ") return NOTEQ;
+  if (name == "LT") return LT;
+  if (name == "LTEQ") return LTEQ;
+  if (name == "GT") return GT;
+  if (name == "GTEQ") return GTEQ;
+  return UNKOWN; // Default case for unknown names
+}
+
+TokenType checkIfKeyword(string &tokenText);
+
 class Token{
   string text;
-  enum TokenType kind;
+  TokenType kind;
 
   public:
-  Token(string tokenText, enum TokenType tokenKind);
-  static enum TokenType checkIfKeyword(string tokenText);
+  Token(string tokenText, TokenType tokenKind);
 };

+ 11 - 0
src/main.cpp

@@ -0,0 +1,11 @@
+#include <iostream>
+#include "Lexer.hpp"
+
+
+int main()
+{
+  std::string g = "IF";
+  std::cout << token_name(END_OF_FILE) << std::endl;
+  std::cout << token_name(token_type_from_name("NEWLINE")) << std::endl;
+  return 0;
+}