我需要连接到旧的PostGreSQL数据库(版本7.3),我在XP机器上使用Python 3.2.py-postgresql包似乎合适,但它似乎只使用3.0版本中实现的3.0协议.我想使用Python连接到这个数据库,但是当我尝试时,我收到了一个意外的EOF错误,我认为这是使用更新协议的包的结果.
我可以使用pgAdminIII程序连接到数据库就好了.有任何想法吗?
TL; DR:
我的计算器语法依赖于递归下降到彼此内部嵌套括号组,但是太多嵌套的parens(大约20个)会导致堆栈溢出.我怎样才能解决这个问题?有没有办法让问题更平坦?
长表:
不久之前 - 我的脑袋深深陷入了小规模的嵌入式系统 - 没有半脑的人会遇到堆栈溢出.现在因为更抽象的任务而感到谦卑,我来这里寻求建议.
激励项目是Android的计算器.目前的计算器在很多方面都显得不够,但我今天没带上我的肥皂盒,所以我只是直接遇到我遇到的问题:堆栈溢出!
具体来说,当用户创建太多嵌套括号组时,包括函数等.这是因为我的计算器依赖于ANTLR语法,这意味着它使用递归下降.方便地,这允许它通过PEMDAS连续运行,允许容易地计算嵌套函数和括号.但!我发现 - 根据电话 - 按下parens按钮20次左右会导致崩溃,这是由于调用堆栈产生的堆栈溢出导致大约100个函数调用深度,这是递归下降方法的自然结果.
我知道,flat比嵌套更好,但它下降的4个级别(函数)是完全必要的,而其他几个级别使我的生活在对数上变得更容易.即使删除这些级别也无法解决问题:用户仍然可以在几分钟内导致系统崩溃.有一个"太多的parens!" 错误信息是坏的(这是其他计算器之一会做的事情).另外,我使用AST输出来格式化输入字符串以使其非常类似,因此预先计算parens组会使整个系统有点过于复杂.
所以,问题:
即使问这个问题似乎很愚蠢,但是:有没有办法在ANTLR中实现一个语法,它可以解析和解释复杂和深度嵌套的表达式而不会爆炸调用堆栈?
语法:
grammar doubleCalc;
options {
language = Java;
output = AST;
// k=2;
}
// Calculation function.
prog returns [double value]
: e=addsub EOF {$value = $e.value;}
;
addsub returns [double value]
: e=muldiv {$value = $e.value;}
( PLUS^ e=muldiv {$value += $e.value;}
| MINUS^ e=muldiv {$value -= $e.value;}
)*
;
muldiv returns [double value]
: e=power {$value = …Run Code Online (Sandbox Code Playgroud)