From 12eeefcdba1ee392f033f51e6b9826eaae3c4de6 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Mon, 13 Jun 2016 23:16:54 +0300 Subject: Add tokenizer, parser and support for certain operations --- main/core/tokenizer/Tokenizer.java | 100 +++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 main/core/tokenizer/Tokenizer.java (limited to 'main/core/tokenizer/Tokenizer.java') diff --git a/main/core/tokenizer/Tokenizer.java b/main/core/tokenizer/Tokenizer.java new file mode 100644 index 0000000..4a12014 --- /dev/null +++ b/main/core/tokenizer/Tokenizer.java @@ -0,0 +1,100 @@ +package com.jantuomi.interpreter.main.core.tokenizer; + + +import com.jantuomi.interpreter.main.core.tokenizer.token.Token; +import com.jantuomi.interpreter.main.exception.ExceptionManager; +import com.jantuomi.interpreter.main.exception.InterpreterException; + +import java.util.*; + +/** + * Created by jan on 10.6.2016. + */ +public class Tokenizer { + private String sourceString; + + public List getTokens() { + return tokens; + } + + private List tokens = new ArrayList<>(); + + private static SortedMap tokenRegexes = new TreeMap<>(); + private static final ListillegalTokenTypes = new ArrayList<>(); + + private static final Tokenizer instance = new Tokenizer(); + + public static final Tokenizer getInstance() { + return instance; + } + + private Tokenizer() { + tokenRegexes.put(Token.Type.CommentToken, "^\\/\\*(.*)\\*\\/"); + tokenRegexes.put(Token.Type.StringLiteralToken, "^\"(.*)\""); + tokenRegexes.put(Token.Type.WhitespaceToken, "^( |\t)"); + tokenRegexes.put(Token.Type.NewlineToken, "^(\n|\r\n)"); + tokenRegexes.put(Token.Type.AdditionToken, "^(\\+)"); + tokenRegexes.put(Token.Type.SubtractionToken, "^(\\-)"); + tokenRegexes.put(Token.Type.DivisionToken, "^(\\/)"); + tokenRegexes.put(Token.Type.MultiplicationToken, "^(\\*)"); + tokenRegexes.put(Token.Type.AssignmentToken, "^(\\<\\-)"); + tokenRegexes.put(Token.Type.LessThanToken, "^(\\<)"); + tokenRegexes.put(Token.Type.GreaterThanToken, "^(\\>)"); + tokenRegexes.put(Token.Type.LessOrEqualThanToken, "^(\\<\\=)"); + tokenRegexes.put(Token.Type.GreaterOrEqualThanToken, "^(\\>\\=)"); + tokenRegexes.put(Token.Type.EqualsToken, "^(\\=\\=)"); + tokenRegexes.put(Token.Type.NotEqualsToken, "^(\\!\\=)"); + tokenRegexes.put(Token.Type.OpenParenToken, "^(\\()"); + tokenRegexes.put(Token.Type.ClosedParenToken, "^(\\))"); + tokenRegexes.put(Token.Type.FunctionDefineToken, "^(func)"); + tokenRegexes.put(Token.Type.DeclarationToken, "^(decl)"); + tokenRegexes.put(Token.Type.IntegerLiteralToken, "^(\\d+)"); + tokenRegexes.put(Token.Type.SymbolToken, "^([a-zA-Z]+\\w*)"); + + illegalTokenTypes.add(Token.Type.NotAToken); + } + + public List tokenize(String string) { + sourceString = string; + tokens.clear(); + int line = 1; + for (int i = 0; i < string.length();) { + + Token token = Token.makeToken(string.substring(i), tokenRegexes, line); + + if (token == null) { + i++; + continue; + } + + if (token.getTokenType() == Token.Type.NewlineToken) { + line++; + } + + if (!illegalTokenTypes.contains(token.getTokenType())) { + tokens.add(token); + } else { + ExceptionManager.raise(InterpreterException.Exception.IllegalTokenException, line, Arrays.asList(token.getText())); + } + + String tokenRawText = token.getRawText(); + if (tokenRawText == null) { + tokenRawText = token.getText(); + } + if (tokenRawText != null) { + i += tokenRawText.length(); + } else { + i++; + } + } + return tokens; + } + + public static void printTokens(List tokens) { + System.out.println("### Tokens: ###"); + for (Token token : tokens) { + System.out.println(String.format("%-40s %s", token.getTokenType(), token.getText())); + } + System.out.println("### End ###"); + } +} -- cgit v1.3