Не уверен, что я делаю не так ... - ||| PYTHON ||| - PullRequest
0 голосов
/ 05 апреля 2020

Я делаю что-то, следуя инструкциям. Я думаю, что все сделал правильно, но при запуске программы я получаю сообщение об ошибке.

Вот мои файлы с кодами:

1) основной файл - frs.py

from parser import Parser
from lexer import Lexer

def main():
    filename = 'hello.frs'
    file     = open(filename, 'r')
    lexer    = Lexer(file)
    parser   = Parser(lexer.tokens)

    lexer.tokenizer()
    print ("TOKENS:")
    print (lexer.tokens, "\n")

    parser.build_AST()
    print ("AST:")
    print (parset.AST, "\n")


if __name__ == "__main__":
    main()

2) класс Lexer - lexer.py

class Lexer:

    def __init__(self, data):
        self.data = data
        self.tokens = []
        self.keywords = [
            'tosay'
        ]

    def tokenizer(self):
        for loc in self.data:
            tmp = []
            tid = ''

            for l in loc:
                if l == '"' and tid == '':
                    tid = 'char'
                    tmp = []
                elif l == '"' and tid == 'char':
                    self.tokens.append({'id': tid, 'value': ''.join(tmp)})
                    tid = ''
                    tmp = []
                elif l == ':':
                    self.tokens.append({'id': 'label', 'value': ''.join(tmp)})
                    tmp = []
                elif ''.join(tmp) in self.keywords:
                    self.tokens.append({'id': 'keyword', 'value': ''.join(tmp)})
                    tmp = []
                elif l == ' ' and tid != 'char':
                    continue
                else:
                    tmp.append(l)

3) класс Parser - parser.py

class Parser:
    def __init__(self, tokens):
        self.tokens = tokens
        self.AST    = []

    def add_node(self, parent, node):
        for a in self.AST:
            if parent in a:
                a[parent].append(node)

    def build_AST(self):
        saved   = {}
        parent  = {}
        collect = False

        for token in self.tokens:
            if token['id'] == 'label':
                t = {token['value']: []}

                if parent != t:
                    parent = token['value']
                    self.AST.append(t)

            elif token['id'] == 'keyword':
                if token['value'] == 'stop':
                    t = {token['value']: 0}
                    self.add_node(parent, t)
                else:
                    if collect ==  False:
                        saved = token
                        collect = True
                    else:
                        t = {saved['value']: token[:value]}
                        self.add_node(parent, t)
                        collect = False

            elif token['id'] == 'char':
                if collect = False:
                    saved = token
                    collect = True
                else:
                    t = {saved['value']: token['value']}
                    self.add_node(parent, t)
                    collect = False

4) файл с моим собственным языком и является Цель урока - hello.frs:

commence:
    tosay "Hello World"
stop

В принципе, пока я не добавил from parser import Parser, все работало. Но после добавления я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
 File "frs.py", line 1, in <module>
  from parser import Parser
ImportError: cannot import name 'Parser'

Я попытался переименовать класс, но он все равно не работает. Пожалуйста, помогите мне! Заранее спасибо.

1 Ответ

1 голос
/ 05 апреля 2020

Две ошибки в ваших файлах.

1) Файл parser.py:

Изменение:

if collect = False:

На

if collect == False:

2 ) Файл frs.py

Изменить:

print (parset.AST, "\n")

На:

print (parser.AST, "\n")`

После вышеперечисленных исправлений Мой вывод

TOKENS:
[{'id': 'label', 'value': 'commence'}, {'id': 'keyword', 'value': 'tosay'}, {'id': 'char', 'value': 'Hello World'}] 

AST:
[{'commence': [{'tosay': 'Hello World'}]}] 
...