From 26a2b27def697f64b53979b1fb0ed60f3d57dbb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Wed, 10 Jul 2019 13:48:13 +0200 Subject: [PATCH] Add new token: TokenType.BOOL --- smnp/main.py | 2 +- smnp/token/model.py | 2 +- smnp/token/tokenizer.py | 23 ++++++++++++----------- smnp/token/tokenizers/bool.py | 11 +++++++++++ smnp/token/type.py | 1 + smnp/type/model.py | 1 + 6 files changed, 27 insertions(+), 13 deletions(-) create mode 100644 smnp/token/tokenizers/bool.py diff --git a/smnp/main.py b/smnp/main.py index 71cb648..ede6963 100644 --- a/smnp/main.py +++ b/smnp/main.py @@ -8,7 +8,7 @@ from smnp.program.interpreter import Interpreter def main(): try: stdLibraryEnv = loadStandardLibrary() - Interpreter.interpretFile(sys.argv[1], printAst=True, baseEnvironment=stdLibraryEnv) + Interpreter.interpretFile(sys.argv[1], printTokens=True, printAst=False, baseEnvironment=stdLibraryEnv) except SmnpException as e: print(e.message()) diff --git a/smnp/token/model.py b/smnp/token/model.py index 08ee2e7..cf04827 100644 --- a/smnp/token/model.py +++ b/smnp/token/model.py @@ -8,7 +8,7 @@ class Token: self.rawValue = rawValue def __str__(self): - return "Token(" + str(self.type) + ", '" + str(self.value) + "', " + str(self.pos) + ")" + return "{" + str(self.type.name) + ", '" + str(self.value) + "', " + str(self.pos) + "}" def __repr__(self): return self.__str__() diff --git a/smnp/token/tokenizer.py b/smnp/token/tokenizer.py index bf5dec4..aa8a1af 100644 --- a/smnp/token/tokenizer.py +++ b/smnp/token/tokenizer.py @@ -1,5 +1,6 @@ from smnp.error.syntax import SyntaxException from smnp.token.model import TokenList +from smnp.token.tokenizers.bool import boolTokenizer from smnp.token.tokenizers.comment import commentTokenizer from smnp.token.tokenizers.identifier import identifierTokenizer from smnp.token.tokenizers.keyword import typeTokenizer @@ -31,8 +32,9 @@ tokenizers = ( # Types separated(regexPatternTokenizer(TokenType.INTEGER, r'\d')), stringTokenizer, - typeTokenizer, noteTokenizer, + boolTokenizer, + typeTokenizer, # Keywords separated(defaultTokenizer(TokenType.FUNCTION)), @@ -50,7 +52,6 @@ tokenizers = ( commentTokenizer, ) - filters = [ lambda token: token.type is not None, lambda token: token.type != TokenType.COMMENT @@ -58,33 +59,33 @@ filters = [ def tokenize(lines): - tokens = [] - for lineNumber, line in enumerate(lines): + tokens = [] + for lineNumber, line in enumerate(lines): current = 0 while current < len(line): - consumedChars, token = combinedTokenizer(line, current, lineNumber) - + consumedChars, token = combinedTokenizer(line, current, lineNumber) + if consumedChars == 0: raise SyntaxException(f"Unknown symbol '{line[current]}'", (lineNumber, current)) - + current += consumedChars tokens.append(token) - + return TokenList(filterTokens(filters, tokens), lines) def combinedTokenizer(line, current, lineNumber): for tokenizer in tokenizers: consumedChars, token = tokenizer(line, current, lineNumber) - if consumedChars > 0: + if consumedChars > 0: return (consumedChars, token) return (0, None) -def filterTokens(filters, tokens): +def filterTokens(filters, tokens): if not filters: return tokens - + return list(filterTokens(filters[1:], (token for token in tokens if filters[0](token)))) diff --git a/smnp/token/tokenizers/bool.py b/smnp/token/tokenizers/bool.py new file mode 100644 index 0000000..2810060 --- /dev/null +++ b/smnp/token/tokenizers/bool.py @@ -0,0 +1,11 @@ +from smnp.token.tools import keywordsTokenizer, separated +from smnp.token.type import TokenType + + +def boolTokenizer(input, current, line): + consumedChars, token = separated(keywordsTokenizer(TokenType.BOOL, "true", "false"))(input, current, line) + if consumedChars > 0: + token.value = token.value == "true" + return (consumedChars, token) + + return (0, None) diff --git a/smnp/token/type.py b/smnp/token/type.py index 315b843..2489903 100644 --- a/smnp/token/type.py +++ b/smnp/token/type.py @@ -21,6 +21,7 @@ class TokenType(Enum): INTEGER = 'integer' STRING = 'string' NOTE = 'note' + BOOL = 'bool' TYPE = 'type' FUNCTION = 'function' RETURN = 'return' diff --git a/smnp/type/model.py b/smnp/type/model.py index a161ef2..1d42e15 100644 --- a/smnp/type/model.py +++ b/smnp/type/model.py @@ -13,6 +13,7 @@ class Type(Enum): MAP = (dict, lambda x: '{' + ', '.join(f"'{k.stringify()}' -> '{v.stringify()}'" for k, v in x.items()) + '}') PERCENT = (float, lambda x: f"{int(x * 100)}%") NOTE = (Note, lambda x: x.note.name) + BOOL = (bool, lambda x: str(x).lower()) SOUND = (Sound, lambda x: x.file) TYPE = (None, lambda x: x.name.lower()) VOID = (type(None), lambda x: _failStringify(Type.VOID))