Skip to content
This repository has been archived by the owner on Jul 10, 2024. It is now read-only.

Commit

Permalink
add more StateMachines and TokenTypes
Browse files Browse the repository at this point in the history
  • Loading branch information
Marc Siegfarth committed Apr 24, 2024
1 parent f4ed447 commit de76e9f
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,39 @@ public class Lexer implements ILexer {
new IntegerLiteralStateMachine(),
new DoubleLiteralStateMachine(),
new StringLiteralStateMachine(),
new KeywordStateMachine("int"),
new KeywordStateMachine("double"),
new KeywordStateMachine("string"),
new KeywordStateMachine("empty"),
new KeywordStateMachine("if"),
new KeywordStateMachine("else"),
new KeywordStateMachine("while"),
new KeywordStateMachine("do"),
new KeywordStateMachine("for"),
new KeywordStateMachine("func"),
new KeywordStateMachine("cnuf"),
new KeywordStateMachine("return"),
new KeywordStateMachine("switch"),
new KeywordStateMachine("case"),
new KeywordStateMachine("default"),
new KeywordStateMachine("call"),
new KeywordStateMachine("print"),
new KeywordStateMachine("int", TokenType.TOK_TYPE_INT),
new KeywordStateMachine("double", TokenType.TOK_TYPE_DOUBLE),
new KeywordStateMachine("string", TokenType.TOK_TYPE_STRING),
new KeywordStateMachine("empty", TokenType.TOK_TYPE_EMPTY),
new KeywordStateMachine("if", TokenType.TOK_IF),
new KeywordStateMachine("else", TokenType.TOK_ELSE),
new KeywordStateMachine("while", TokenType.TOK_WHILE),
new KeywordStateMachine("do", TokenType.TOK_DO),
new KeywordStateMachine("for", TokenType.TOK_FOR),
new KeywordStateMachine("func", TokenType.TOK_FUNC),
new KeywordStateMachine("cnuf", TokenType.TOK_CNUF),
new KeywordStateMachine("return", TokenType.TOK_RETURN),
new KeywordStateMachine("switch", TokenType.TOK_SWITCH),
new KeywordStateMachine("case", TokenType.TOK_CASE),
new KeywordStateMachine("default", TokenType.TOK_DEFAULT),
new KeywordStateMachine("call", TokenType.TOK_CALL),
new KeywordStateMachine("print", TokenType.TOK_PRINT),
new OperatorStateMachine("{", TokenType.TOK_LBRACE),
new OperatorStateMachine("}", TokenType.TOK_RBRACE),
new OperatorStateMachine("(", TokenType.TOK_LPAREN),
new OperatorStateMachine(")", TokenType.TOK_RPAREN),
new OperatorStateMachine(",", TokenType.TOK_COMMA),
new OperatorStateMachine(":", TokenType.TOK_COLON),
new OperatorStateMachine("+", TokenType.TOK_PLUS),
new OperatorStateMachine("-", TokenType.TOK_MINUS),
new OperatorStateMachine("*", TokenType.TOK_MUL),
new OperatorStateMachine("/", TokenType.TOK_DIV),
new OperatorStateMachine("==", TokenType.TOK_EQUAL),
new OperatorStateMachine("!=", TokenType.TOK_NOT_EQUAL),
new OperatorStateMachine("&&", TokenType.TOK_LOGICAL_AND),
new OperatorStateMachine("||", TokenType.TOK_LOGICAL_OR),
new OperatorStateMachine(";", TokenType.TOK_SEMICOLON),
new OperatorStateMachine("=", TokenType.TOK_ASSIGN),
new IdentifierStateMachine()
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,37 @@ public enum TokenType {
TOK_IDENTIFIER,
TOK_KEYWORD,
TOK_EOF,
TOK_TYPE_INT,
TOK_TYPE_DOUBLE,
TOK_TYPE_STRING,
TOK_TYPE_EMPTY,
TOK_IF,
TOK_ELSE,
TOK_WHILE,
TOK_DO,
TOK_FOR,
TOK_FUNC,
TOK_CNUF,
TOK_RETURN,
TOK_SWITCH,
TOK_CASE,
TOK_DEFAULT,
TOK_CALL,
TOK_PRINT,
TOK_LBRACE,
TOK_RBRACE,
TOK_LPAREN,
TOK_RPAREN,
TOK_COMMA,
TOK_COLON,
TOK_PLUS,
TOK_MINUS,
TOK_MUL,
TOK_DIV,
TOK_EQUAL,
TOK_NOT_EQUAL,
TOK_LOGICAL_AND,
TOK_LOGICAL_OR,
TOK_SEMICOLON,
TOK_ASSIGN
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,15 @@
public class KeywordStateMachine extends StateMachine {

private final String keyword;
private final TokenType tokenType;

public KeywordStateMachine(String keyword) {
this(keyword, TokenType.TOK_KEYWORD);
}

public KeywordStateMachine(String keyword, TokenType tokenType) {
this.keyword = keyword;
this.tokenType = tokenType;
}

@Override
Expand All @@ -30,7 +36,7 @@ public void init() {
@Override
public TokenType getTokenType() {
if (isInAcceptState()) {
return TokenType.TOK_KEYWORD;
return tokenType;
}

return TokenType.TOK_INVALID;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.auberer.compilerdesignlectureproject.lexer.statemachine;

import com.auberer.compilerdesignlectureproject.lexer.TokenType;

public class OperatorStateMachine extends StateMachine {

private final String punctuation;
private final TokenType tokenType;

public OperatorStateMachine(String punctuation, TokenType tokenType) {
this.punctuation = punctuation;
this.tokenType = tokenType;
}

@Override
public void init() {
// Start state
State start = new State("q0");
start.setStartState(true);
addState(start);

// Letter states
State[] states = new State[punctuation.length()];
for (int i = 0; i < punctuation.length(); i++) {
states[i] = new State("q" + (i+1));
addState(states[i]);
addCharTransition(i == 0 ? start : states[i - 1], states[i], punctuation.charAt(i));
}

// Set the last state as the accept state
states[punctuation.length() - 1].setAcceptState(true);
}

@Override
public TokenType getTokenType() {
return tokenType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public void testKeywordValidation() throws Exception {
Reader reader = createReader(fileName, "int");
Lexer lexer = new Lexer(reader);

lexer.expect(TokenType.TOK_KEYWORD);
lexer.expect(TokenType.TOK_TYPE_INT);

cleanUp(fileName, reader);
}
Expand Down Expand Up @@ -114,7 +114,7 @@ public void testValidationOfMultipleTokens() throws Exception {
Reader reader = createReader(fileName, "int test\n08.15 \n 42 \"hallo\" \"hello world\"");
Lexer lexer = new Lexer(reader);

lexer.expect(TokenType.TOK_KEYWORD);
lexer.expect(TokenType.TOK_TYPE_INT);
lexer.expect(TokenType.TOK_IDENTIFIER);
lexer.expect(TokenType.TOK_DOUBLE_LITERAL);
lexer.expect(TokenType.TOK_INTEGER_LITERAL);
Expand All @@ -132,7 +132,7 @@ public void testUnexpectedToken() throws Exception {
Reader reader = createReader(fileName, "int test\n08.1.5 \n 42 \"hallo\" \"hello world\"");
Lexer lexer = new Lexer(reader);

lexer.expect(TokenType.TOK_KEYWORD);
lexer.expect(TokenType.TOK_TYPE_INT);
lexer.expect(TokenType.TOK_IDENTIFIER);

try {
Expand Down

0 comments on commit de76e9f

Please sign in to comment.