initial
This commit is contained in:
0
s_basic/context/__init__.py
Normal file
0
s_basic/context/__init__.py
Normal file
56
s_basic/context/context.py
Normal file
56
s_basic/context/context.py
Normal 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",
|
||||
|
||||
|
Reference in New Issue
Block a user