Files
Nassi-Shneiderman-Diagramm-…/interpreter/_token.py
2021-03-28 17:02:22 +02:00

58 lines
1.6 KiB
Python

"""Private definitions for Token class used by the Lexer"""
import re
from enum import IntEnum
from typing import Union
NUMERIC_CONSTANT_PATTERN = re.compile("([0-9]+)|(true)|(false)")
KEYWORD_PATTERN = re.compile("(return)|(continue)|(break)")
class Token_type(IntEnum):
UNKNOWN=-1
LEFT_PAREN=0,
RIGTH_PAREN=1,
LEFT_CURLY=2,
RIGHT_CURLY=3,
LEFT_BRACKET=4,
RIGHT_BRACKET=5,
COMMA=6,
NUMERIC_CONSTANT=7,
IF_STATEMENT=8,
WHILE_STATEMENT=9,
DO_WHILE_STATEMENT=10,
FOR_STATEMENT=11,
KEY_WORD=13,
STRING_LITERAL=14
class Token:
def __init__(self, type: Token_type, content: Union[str, None]=None) -> None:
self.type = type
self.content = content
def make_token(tag: str) -> Token:
if tag == '(':
return Token(Token_type.LEFT_PAREN)
elif tag == ')':
return Token(Token_type.RIGTH_PAREN)
elif tag == '{':
return Token(Token_type.LEFT_CURLY)
elif tag == '}':
return Token(Token_type.RIGHT_CURLY)
elif tag == '[':
return Token(Token_type.LEFT_BRACKET)
elif tag == ']':
return Token(Token_type.RIGHT_BRACKET)
elif tag == ',':
return Token(Token_type.COMMA)
elif NUMERIC_CONSTANT_PATTERN.match(tag):
return Token(Token_type.NUMERIC_CONSTANT, tag)
elif tag == 'if':
return Token(Token_type.IF_STATEMENT)
elif tag == 'while':
return Token(Token_type.WHILE_STATEMENT)
elif tag == 'do':
return Token(Token_type.DO_WHILE_STATEMENT)
elif tag == 'for':
return Token(Token_type.FOR_STATEMENT)
#TODO: finish this