Added lexer
This commit is contained in:
@@ -1,31 +0,0 @@
|
||||
from typing import Optional
|
||||
|
||||
from CCLang_sly.Parser import Parser
|
||||
from Interpreter.Validator import Validator
|
||||
from CCLang_sly.Lexer import Lexer
|
||||
from Interpreter.Repo import Repo
|
||||
from Interpreter.Utils import Utils
|
||||
from Models.AbstractSyntaxTree.AbstractSyntaxTree import AbstractSyntaxTree
|
||||
|
||||
|
||||
class Interpreter:
|
||||
|
||||
def __init__(self, repo: Repo, utils: Utils) -> None:
|
||||
self.__repo = repo
|
||||
self.__utils = utils
|
||||
# self.__lexer = Lexer(repo, utils)
|
||||
# self.__parser = Parser(repo, utils)
|
||||
# self.__validator = Validator(repo, utils)
|
||||
|
||||
def interpret(self, line_str: str) -> None:
|
||||
"""
|
||||
Interprets code line
|
||||
:param line_str:
|
||||
:return:
|
||||
"""
|
||||
lexer = Lexer()
|
||||
parser = Parser()
|
||||
env = {}
|
||||
ast = parser.parse(lexer.tokenize(line_str))
|
||||
if ast is not None:
|
||||
print(ast)
|
@@ -1,108 +0,0 @@
|
||||
from sly import Lexer as SlyLexer
|
||||
|
||||
from Models.CCLang.TokenDefinition import TokenDefinition
|
||||
|
||||
|
||||
class Lexer(SlyLexer):
|
||||
# Ignored pattern
|
||||
ignore = '\t '
|
||||
# ignore_comment = r'(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)|([#].*)'
|
||||
ignore_comment = r'([#].*|(//.*))'
|
||||
ignore_newline = r'\n+'
|
||||
|
||||
tokens = {
|
||||
LIBRARY,
|
||||
CLASS,
|
||||
FUNCTION,
|
||||
VARIABLE,
|
||||
USE,
|
||||
FROM,
|
||||
OUTPUT,
|
||||
INPUT,
|
||||
LENGTH,
|
||||
RANGE,
|
||||
EXIT,
|
||||
IF,
|
||||
ELSEIF,
|
||||
ELSE,
|
||||
CONTINUE,
|
||||
IN,
|
||||
RETURN,
|
||||
WHILE,
|
||||
FOR,
|
||||
PUBLIC,
|
||||
THIS,
|
||||
LBRACE,
|
||||
RBRACE,
|
||||
LPARAN,
|
||||
RPARAN,
|
||||
LBRACKET,
|
||||
RBRACKET,
|
||||
SEMICOLON,
|
||||
COLON,
|
||||
COMMA,
|
||||
POINT,
|
||||
PLUS,
|
||||
MINUS,
|
||||
ASTERIK,
|
||||
SLASH,
|
||||
EQUAL,
|
||||
CARET,
|
||||
TRUE,
|
||||
FALSE,
|
||||
STRING,
|
||||
NUMBER,
|
||||
EMPTY,
|
||||
|
||||
NAME
|
||||
}
|
||||
|
||||
# token definition
|
||||
LIBRARY = TokenDefinition.Library.value
|
||||
CLASS = TokenDefinition.Class.value
|
||||
FUNCTION = TokenDefinition.Function.value
|
||||
VARIABLE = TokenDefinition.Variable.value
|
||||
USE = TokenDefinition.Use.value
|
||||
FROM = TokenDefinition.From.value
|
||||
OUTPUT = TokenDefinition.Output.value
|
||||
INPUT = TokenDefinition.Input.value
|
||||
LENGTH = TokenDefinition.Length.value
|
||||
RANGE = TokenDefinition.Range.value
|
||||
EXIT = TokenDefinition.Exit.value
|
||||
IF = TokenDefinition.If.value
|
||||
ELSEIF = TokenDefinition.ElseIf.value
|
||||
ELSE = TokenDefinition.Else.value
|
||||
CONTINUE = TokenDefinition.Continue.value
|
||||
IN = TokenDefinition.In.value
|
||||
RETURN = TokenDefinition.Return.value
|
||||
WHILE = TokenDefinition.While.value
|
||||
FOR = TokenDefinition.For.value
|
||||
PUBLIC = TokenDefinition.Public.value
|
||||
THIS = TokenDefinition.This.value
|
||||
LBRACE = TokenDefinition.LeftBrace.value
|
||||
RBRACE = TokenDefinition.RightBrace.value
|
||||
LPARAN = TokenDefinition.LeftParenthesis.value
|
||||
RPARAN = TokenDefinition.RightParenthesis.value
|
||||
LBRACKET = TokenDefinition.LeftBracket.value
|
||||
RBRACKET = TokenDefinition.RightBracket.value
|
||||
SEMICOLON = TokenDefinition.Semicolon.value
|
||||
COLON = TokenDefinition.Colon.value
|
||||
COMMA = TokenDefinition.Comma.value
|
||||
POINT = TokenDefinition.Point.value
|
||||
PLUS = TokenDefinition.Plus.value
|
||||
MINUS = TokenDefinition.Minus.value
|
||||
ASTERIK = TokenDefinition.Asterisk.value
|
||||
SLASH = TokenDefinition.Slash.value
|
||||
EQUAL = TokenDefinition.Equal.value
|
||||
CARET = TokenDefinition.Caret.value
|
||||
TRUE = TokenDefinition.BoolTrue.value
|
||||
FALSE = TokenDefinition.BoolFalse.value
|
||||
STRING = TokenDefinition.String.value
|
||||
NUMBER = TokenDefinition.Number.value
|
||||
EMPTY = TokenDefinition.Empty.value
|
||||
|
||||
NAME = TokenDefinition.Name.value
|
||||
|
||||
def error(self, t):
|
||||
print("Illegal character '%s'" % t.value[0])
|
||||
# self.index += 1
|
@@ -1,61 +0,0 @@
|
||||
from sly import Parser as SlyParser
|
||||
|
||||
from CCLang_sly.Lexer import Lexer
|
||||
|
||||
|
||||
class Parser(SlyParser):
|
||||
tokens = Lexer.tokens
|
||||
|
||||
#precedence = (
|
||||
# ('left', '+', '-'),
|
||||
# ('left', '*', '/'),
|
||||
# ('right', 'UMINUS'),
|
||||
#)
|
||||
|
||||
def __init__(self):
|
||||
self.env = {}
|
||||
|
||||
@_('')
|
||||
def statement(self, p):
|
||||
pass
|
||||
|
||||
def error(self, p):
|
||||
print(f'ERROR: {p}')
|
||||
pass
|
||||
|
||||
# lib definition
|
||||
@_('PUBLIC LIBRARY NAME LBRACE')
|
||||
def statement(self, p):
|
||||
return ('lib_def', p.NAME, True)
|
||||
|
||||
@_('LIBRARY NAME LBRACE')
|
||||
def statement(self, p):
|
||||
return ('lib_def', p.NAME, False)
|
||||
|
||||
# class definition
|
||||
@_('PUBLIC CLASS NAME LBRACE')
|
||||
def statement(self, p):
|
||||
return ('class_def', p.NAME, True)
|
||||
|
||||
@_('CLASS NAME LBRACE')
|
||||
def statement(self, p):
|
||||
return ('class_def', p.NAME, False)
|
||||
|
||||
# func definition
|
||||
@_('PUBLIC FUNCTION NAME LPARAN statement RPARAN COLON type LBRACE')
|
||||
def statement(self, p):
|
||||
return ('func_def', p.NAME, True)
|
||||
|
||||
@_('FUNCTION NAME LPARAN RPARAN COLON type LBRACE')
|
||||
def statement(self, p):
|
||||
return ('func_def', p.NAME, False)
|
||||
|
||||
# types
|
||||
@_('EMPTY')
|
||||
def type(self, p):
|
||||
return ('type', p.EMPTY)
|
||||
|
||||
# right brace
|
||||
@_('RBRACE')
|
||||
def statement(self, p):
|
||||
return ('end', p.RBRACE)
|
@@ -12,7 +12,6 @@ class Main:
|
||||
self.__utils = self.__services.utils
|
||||
self.__repo = self.__services.repo
|
||||
self.__interpreter = self.__services.interpreter
|
||||
# self.__sly_cclang_interpreter = self.__services.sly_cclang_interpreter
|
||||
|
||||
def console(self) -> None:
|
||||
"""
|
||||
@@ -23,7 +22,6 @@ class Main:
|
||||
while self.__repo.error is None:
|
||||
self.__repo.line_number = i + 1
|
||||
self.__interpreter.interpret(input('> '))
|
||||
# self.__sly_cclang_interpreter.interpret(input('> '))
|
||||
i += 1
|
||||
|
||||
def files(self, file: str) -> None:
|
||||
@@ -44,7 +42,6 @@ class Main:
|
||||
for i in range(0, len(f)):
|
||||
self.__repo.line_number = i + 1
|
||||
self.__interpreter.interpret(f[i])
|
||||
# self.__sly_cclang_interpreter.interpret(f[i])
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
Reference in New Issue
Block a user