python - 使用两个不同的函数后,全局变量不会保持其状态

标签 python compiler-construction global-variables yacc

所以我这几天都遇到麻烦了。基本上,我正在为我使用 python 创建的语言制作编译器。我们已经完成了语法和词法部分,现在正在创建目录过程和变量表(符号表)。在我的 Yacc 文件中,我有:

Yacc.py

import ply.yacc as yacc
import sys

tokens = Lex.tokens
#Global variables
procs = { }
current_fid = ""

# add new value to the procedure directory
def add_procs_to_dict(fid, ftipo, fparams, fdict):
    proc_dict = {}
    proc_dict[fid] = {
        'Tipo' : ftipo,
        'Params' : fparams,
        'Var_dict' : fdict
    }
    return proc_dict

# add new variable value to the procedure directory
def add_vars_to_dict(vid, vtipo, vparams):
    var_dict = {
        'Nombre' : vid,
        'Tipo' : vtipo,
        'Params' : vparams
        }
    print(current_fid)
    print(procs)    
    return proc_dict


# Parsing Rules    
def p_juego(p):
    '''Juego : JUEGO ID DOSP JuegoA JuegoB MainProgram'''
    current_fid = p[2]
    procs = add_procs_to_dict( p[2], p[1], 'void', {})

def p_vars(p):
    '''Vars : VAR ID COR_I Exp COR_D VarSizeA Vars2 DOSP Tipo PCOMA'''
    add_vars_to_dict( p[2], p[9], p[4])

这里要注意的重要一点是,我正在创建一个保存当前 ID 的变量(名为 current_fid ,它是插入字典中的最后一个过程的名称)和一个字典变量(名为procs,即过程/函数目录)作为全局范围。

当解析器输入解析规则 p_juego(p): (假设其输入的代码是正确的,并且我已经单独运行它),它应该设置为变量( current_fidprocs)在解析器进程中找到的值。它确实设置了正确的值。我可以打印函数内的变量并返回预期值。

一旦解析器退出函数p_juego(p)并进入另一个函数,例如p_vars(p)(该函数将最后一个的符号表写入字典)插入全局目录的过程/函数)全局变量(current_fidprocs)内部没有值。 p_vars(p) 内有 2 个打印,始终显示变量为 null。

我对 python 比较陌生,也许我缺少一些关于该语言的东西。我的意图是,如果我在所有内容之前定义一个变量(在代码顶部),那么使用这些“全局”变量的函数将更新它们的值并始终保留它们,即使另一个函数尝试访问它们也是如此。 我尝试将过程添加到名为 Semantics.py 的新 python 文件中,但变量的值在先前设置值的函数之外始终为 null。

我在这里缺少什么?

最佳答案

为了避免这样的范围问题并更加明确,我建议您使用一个类。然后您可以使用 self.variable 来保存类方法调用之间的信息。

关于python - 使用两个不同的函数后,全局变量不会保持其状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35962658/

相关文章:

javascript - 在 JavaScript 中访问原始全局变量和属性

c++ - 仅在发布中存在错误

compiler-construction - 为什么 Bison (Yacc) 显然无缘无故地打印新行?

c# - 为什么在函数中使用名称参数实际上会生成更多代码?

c++ - 我应该在启动时或第一次使用它们时设置全局变量值吗? C++

python - 将文本放置在圆圈周围

python - 如何在pytorch中通过给定的索引和张量生成新的张量?

python - 让模块的用户覆盖 Python 中某些函数的适当方法

python - 在 Python 中向量化重复的数学函数

c++ - 在库中使用全局变量