This commit is contained in:
2018-10-03 22:13:33 +02:00
parent a30d13392e
commit fed33b6281
10 changed files with 1133 additions and 0 deletions

0
s_basic/__init__.py Normal file
View File

View File

View File

@@ -0,0 +1,19 @@
"""
This module provides abstract code segment classes.
"""
from abc import ABC, abstractmethod
class AbstractCodeSegment(ABC):
@abstractmethod
def parse(self):
pass
class AbstractNestingCodeSegment(AbstractCodeSegment):
@abstractmethod
def parse_children(self):
pass
@abstractmethod
def parse_child(self):
pass

View File

@@ -0,0 +1,12 @@
"""
This module provides statement classes.
"""
from .abc import AbstractCodeSegment
class VariableDefinitionStatement(AbstractCodeSegment):
def __init__(self, parsing_context):
self.parsing_context = parsing_context
def parse(self):

View File

View File

@@ -0,0 +1,56 @@
"""
This module provides the parsing context classes.
"""
from ..util import CharacterDevice
class ParsingContext(object):
def __init__(self, file_, static_context):
self._file = CharacterDevice(file_)
self._static = static_context
self._line = 0
self._column = 0
self._last_column = 0
def getc(self):
res = self._file.getc()
if(res == "\n"):
self._line += 1
self._last_column = self._column
self._column = 0
else:
self._column += 1
return res
def ungetc(self, c):
if(c == "\n"):
self._column = self._last_column
self._line -= 1
else:
self._column -= 1
return self._file.ungetc(c)
def ungets(self, s):
for c in s:
self.ungetc(c)
class StaticParsingContext(object):
def __init__(self, custom_kwd_code_segments, custom_ctx_code_segments):
self._kwd_code_segments = {
(["int", "str", "chr"], ["statement"]): "variable_definition_segment",
(["STOP"], ["statement"]): "stop_command_segment",
(["CALL"], ["statement"]): "routine_call_segment",
(["("], ["expression", "int"]): "arithmetic_segment",
(["ROUTINE"], ["statement"]): "routine_segment",
(["WHILE"], ["statement"]): "while_segment",
(["IF"], ["statement"]): "if_segment",
(["\"", "`"], ["expression", "str"]): "string_definition_segment",
(["'"], ["expression", "chr"]): "character_definition_segment"
}
self._kwd_code_segments.update(custom_kwd_code_segments)
self._ctx_code_segments = {
["statement"]: "assignment_segment",
["expression", "int"]: "arithmetic_segment",

0
s_basic/util/__init__.py Normal file
View File

18
s_basic/util/io.py Normal file
View File

@@ -0,0 +1,18 @@
"""
This module provides utility functions and classed for I/O.
"""
class CharacterDevice(object):
def __init__(self, file_):
self._file = file_
def getc(self):
return self._file.read(1)
def ungetc(self, c):
self._file.seek(-1, 1)
def ungets(self, s):
self._file.seel(-len(s), 1)
def close(self):
return self._file.close()