#python #python-3.x
#python #python-3.x
Вопрос:
Здравствуйте, я пытаюсь создать лексер для своего языка программирования под названием AJPS, и я борюсь с этим, потому что я отстой с python stacktraces, так что может кто-нибудь, пожалуйста, помогите, спасибо, это также будет язык моей мечты, потому что я продолжаю переключаться с языка на язык, например, как я делал haskell некоторое время, а затем я сделалним затем я сделал f # затем я сделал c затем я сделал c затем я сделал c # (я НЕНАВИДЕЛ ЭТО) затем я перешел на python затем решил сделать это
ajps.py
DIGITS = '0123456789'
#########################################
# ERRORS #
#########################################
class err:
def __init__(self, errn, details):
self.errn = errn
self.details = details
def as_string(self):
result = f'{self.errn}: {self.details}'
return result
class unExChar:
def __init__(self, details):
super().__init__('AJPS DOES NOT UNDERSTAND CHAR AT', details)
#########################################
# TOKENS #
#########################################
AJPS_INT = 'INT'
AJSP_FLOAT = 'FLOAT'
AJSP_PLUS = 'PLUS'
AJSP_MINUS = 'MINUS'
AJSP_MUL = 'MUL'
AJSP_DIV = 'DIV'
AJSP_LPAREN = 'LPAREN'
AJPS_RPAREN = 'RPAREN'
class Token:
def __init__(self, type_, value=None):
self.type = type_
self.value = value
def __repr__(self):
if self.value: return f'{self.type}:{self.value}'
return f'{self.type}'
#########################################
# LEXING CLASS #
#########################################
class Lex:
def __init__(self, text):
self.text = text
self.pos = -1
self.cchar = None
self.advance()
def advance(self):
self.pos = 1
self.cchar = self.text[self.pos] if self.pos < len(self.text) else None
def mtok(self):
tokens = []
while self.cchar != None:
if self.cchar in 't':
self.advance()
elif self.cchar in DIGITS:
tokens.append(self.make_number())
elif self.cchar == 'ps':
tokens.append(Token(AJSP_PLUS))
self.advance()
elif self.cchar == 'ms':
tokens.append(Token(AJSP_MINUS))
self.advance()
elif self.cchar == 'my':
tokens.append(Token(AJSP_MUL))
self.advance()
elif self.cchar == 'de':
tokens.append(Token(AJSP_DIV))
self.advance()
elif self.cchar == 'bp':
tokens.append(Token(AJSP_LPAREN))
self.advance()
elif self.cchar == 'ep':
tokens.append(Token(AJPS_RPAREN))
self.advance()
else:
char = self.cchar
self.advance()
return [], unExChar("'" char "'")
return tokens, None
def make_number(self):
numstr = ''
dotc = 0
while self.cchar != None and self.cchar in DIGITS '.':
if self.cchar == '.':
if dotc == 1: break
dotc = 1
numstr = '.'
else:
numstr = self.cchar
self.advance()
if dotc == 0:
return Token(AJPS_INT, int(numstr))
else:
return Token(AJPS_FLOAT, float(numstr))
#########################################
# RUN #
#########################################
def run(text):
lexer = Lex(text)
toks, err_ = lexer.mtok()
return toks, err_
Моя трассировка стека
ajsp:> 1 ps 2
Traceback (most recent call last):
File "shell.py", line 4, in <module>
result, error = ajsp.run(text)
File "C:UserssudoDesktopajspajsp.py", line 102, in run
toks, err_ = lexer.mtok()
File "C:UserssudoDesktopajspajsp.py", line 77, in mtok
return [], unExChar("'" char "'")
File "C:UserssudoDesktopajspajsp.py", line 17, in __init__
super().__init__('AJPS DOES NOT UNDERSTAND CHAR AT', details)
TypeError: object.__init__() takes exactly one argument (the instance to initialize)
Комментарии:
1. Вы имели в виду наследовать
err
отunExChar
?class unExChar(err)
2. Спасибо, я немного глупый lmfao
3. Джеймс уже решил вашу проблему, но помните, что имена ваших классов должны начинаться с заглавных букв.
Ответ №1:
Вы вызываете super()
свой unExChar
класс, который не является подклассом другого класса, который вы определили. Это означает super
, что по умолчанию object
будет использоваться базовый класс, подклассом которого является everything , но который принимает только один аргумент.
Я думаю, вы просто забыли подкласс err
, попробуйте:
class unExChar(err):
def __init__(self, details):
super().__init__('AJPS DOES NOT UNDERSTAND CHAR AT', details)
Комментарии:
1. Это подкласс
object
, иobject.__init__
не принимает никаких дополнительных аргументов.2. @chepner, это было то, что я пытался передать. думаю, не слишком хорошо. Я уточню.