From dbddf120faedb217873d7aad957001924d05db6e Mon Sep 17 00:00:00 2001 From: cheezedoodle2 Date: Wed, 29 Mar 2023 19:51:26 -0700 Subject: [PATCH] Added lexer/parser driver --- test3.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 test3.py diff --git a/test3.py b/test3.py new file mode 100644 index 0000000..381406f --- /dev/null +++ b/test3.py @@ -0,0 +1,69 @@ +from enum import Enum + +class Tokens(Enum): + QUOTE = 1, + CHAR = 2, + NEWLINE = 3 + +class Lexer: + tokens = list() + def __init__(self): + pass + def lex(self, str): + for c in str: + if c == "'" or c == '"': + self.tokens.append(Tokens.QUOTE) + elif c == "\n": + self.tokens.append(Tokens.NEWLINE) + else: + self.tokens.append(Tokens.CHAR) + def __str__(self): + return ",".join(Tokens(token).name for token in self.tokens) + +class States(Enum): + INITIAL = 0, + BEGINQUOTE = 1 + +class Parser: + def __init__(self): + self.state = States.INITIAL + self.line = 1 + + def transition(self, state): + print(f"{States(self.state).name} -> {States(state).name}") + self.state = state + + def parse(self, tokens): + for token in tokens: + if self.state == States.INITIAL: + if token == Tokens.QUOTE: + self.transition(States.BEGINQUOTE) + elif token == Tokens.NEWLINE: + self.line += 1 + continue + if self.state == States.BEGINQUOTE: + if token == Tokens.QUOTE: + self.transition(States.INITIAL) + elif token == Tokens.CHAR: + pass + elif token == Tokens.NEWLINE: + raise ValueError(f"Unterminated string on line {self.line}") + continue + +if __name__ == "__main__": + test1 = """abcdefg + "abcde" + 'a + bareword +""" + + lexer = Lexer() + lexer.lex(test1) + # print(lexer) + parser = Parser() + try: + parser.parse(lexer.tokens) + except ValueError as error: + print(error) + +