不知道我在做什么错...-||| PYTHON |||

问题描述 投票:-1回答:1

我正在按照教程进行操作。我认为我所做的一切都正确,但是启动程序时出现错误。

这是我的文件代码:

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.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'

我尝试重命名该类,但仍然无法正常工作。请帮我!预先谢谢你。

python programming-languages
1个回答
0
投票

您的文件中有两个错误。

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'}]}] 
© www.soinside.com 2019 - 2024. All rights reserved.