summaryrefslogtreecommitdiff
path: root/lexer.cpp
diff options
context:
space:
mode:
authorHombreLaser <sebastian-440@live.com>2022-03-26 13:18:12 -0600
committerHombreLaser <sebastian-440@live.com>2022-03-26 13:18:12 -0600
commitee0252298ab03c1647b7dcac302ac9fd4e7e8379 (patch)
tree12046727c686850d6cb95f77cd12790a1342137f /lexer.cpp
parentc11d390f07a663a939dd37a764ac755c37e4def3 (diff)
Añadido código del lexer
Diffstat (limited to 'lexer.cpp')
-rw-r--r--lexer.cpp104
1 files changed, 99 insertions, 5 deletions
diff --git a/lexer.cpp b/lexer.cpp
index c58ebb5..9cfb2f7 100644
--- a/lexer.cpp
+++ b/lexer.cpp
@@ -3,18 +3,112 @@
* Luis Sebastián Martínez Vega - LCC */
#include <string>
+#include <cctype>
#include "include/lexer.hpp"
+#include "include/exceptions.hpp"
-Lexer::Lexer(std::string text){
- this->text = text;
+using std::string, std::isalpha, std::isdigit;
+
+Lexer::Lexer(string text): current_token(nil, {}){
+ setText(text);
}
-void Lexer::setCurrentToken(Token val){
- current_token = val;
+void Lexer::setText(string text){
+ this->text = text;
+ // Inicializamos el lexer.
+ current_token = nextToken();
+ var_name = '\0';
}
Token Lexer::getCurrentToken(){
return current_token;
}
-void Lexer::nextToken(){}
+bool Lexer::matchFunction(string function_name){
+ string name = text.substr(current_char, 2);
+ bool matched = name == function_name;
+
+ // Si hubo una coincidencia movemos el puntero.
+ if(matched)
+ current_char += 3;
+
+ return matched;
+}
+
+string Lexer::createNumber(){
+ string number;
+
+ while(isdigit(text[current_char]) && current_char < text.length())
+ {
+ number += text[current_char];
+ ++current_char;
+ }
+
+ return number;
+}
+
+Token Lexer::match(){
+ // Probamos las funciones.
+ if(current_char + 2 < text.length())
+ {
+ if(matchFunction("sin"))
+ return Token(function, "sin");
+ else if(matchFunction("cos"))
+ return Token(function, "cos");
+ else if(matchFunction("tan"))
+ return Token(function, "tan");
+ else if(matchFunction("csc"))
+ return Token(function, "csc");
+ else if(matchFunction("sec"))
+ return Token(function, "ctg");
+ }
+
+ if(isdigit(text[current_char]))
+ return Token(number, createNumber());
+
+ if(isalpha(text[current_char]))
+ {
+ /* Si es la primera vez que se lee un token variable o
+ si la variable leída es igual a la anteriormente leída. */
+ if(var_name == '\0' || var_name == text[current_char])
+ return Token(variable, string(1, var_name));
+
+ // Error, se introdujo una expresión con dos o más variables.
+ throw LexerException("Encontrada más de una variable.");
+ }
+
+ /* El token actual no es ni una variable, número o función.
+ Ahora a probar operadores. */
+ switch(text[current_char])
+ {
+ case '+':
+ ++current_char;
+ return Token(sum, {});
+ case '-':
+ ++current_char;
+ return Token(substraction, {});
+ case '*':
+ ++current_char;
+ return Token(multiplication, {});
+ case '/':
+ ++current_char;
+ return Token(division, {});
+ case '^':
+ ++current_char;
+ return Token(power, {});
+ case '(':
+ ++current_char;
+ return Token(left_parens, {});
+ case ')':
+ ++current_char;
+ return Token(right_parens, {});
+ default:
+ throw LexerException("Carácter inválido.");
+ }
+}
+
+Token Lexer::nextToken(){
+ current_token = match();
+
+ return current_token;
+}