如何解决Python parser.parse与if语句结合
我正在从事一个计算器项目,我使用yacc作为解析器,并且由于要解析4个不同的值,因此我想检查刚刚解析的内容。
我有一种强烈的感觉,它是行不通的,但是我不知道该怎么用。
我只收到以下错误消息:Process finished with exit code -1073741571 (0xC00000FD)
如果有人可以帮助我,我将非常感谢。
if parser.parse(C1):
t[0] = float(C1)
MwGCalc.MwGCalc(C1)
MwGCalc就在这里,目前仅适用于4 * 4,但仅用于测试目的,没有经过深思熟虑:
print("Content-type: text/html\n\n")
import numpy as np
import cgitb
import cgi
cgitb.enable()
form = cgi.FieldStorage()
C1 = form.getvalue('C1')
# Defining Variables
#Actual Calculating
if C1 == 256:
p = C1
print(p)
这是计算器的代码:
import numpy as np
import MwGCalc
#!C:\Users\Letsmoe\Anaconda3\python.exe
print("Content-type: text/html\n\n")
tokens = (
'NAME','NUMBER','PLUS','MINUS','TIMES','DIVIDE','EQUALS','LPAREN','RPAREN','POWER','FUNC',)
# Tokens
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
t_POWER = r'\^'
t_FUNC = r'(sin)|(cos)|(tan)|(ln)|(log)|(sqrt)'
def t_NUMBER(t):
r'\d+' # [0-9]+
try:
t.value = int(t.value)
except ValueError:
print("Integer value too large %d",t.value)
t.value = 0
return t
# Ignored characters
t_ignore = r" \t\r"
def t_newline(t):
r'\n+'
t.lexer.lineno += t.value.count("\n")
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
# Build the lexer
lexer = lex.lex()
# Parsing rules
precedence = (
('left','MINUS'),('left','DIVIDE'),'POWER'),('right','UMINUS'),)
# dictionary of names
names = {}
def p_statement_assign(t):
'statement : NAME EQUALS expression'
names[t[1]] = t[3]
def p_statement_expr(t):
'statement : expression'
if parser.parse(C1):
t[0] = float(C1)
MwGCalc.MwgCalc(C1)
def p_expression_binop(t):
'''expression : expression PLUS expression
| expression MINUS expression
| expression TIMES expression
| expression DIVIDE expression
| expression POWER expression'''
if t[2] == '*':
t[0] = t[3]**t[1]
def p_expression_uminus(t):
'expression : MINUS expression %prec UMINUS'
t[0] = -t[2]
def p_expression_func(t):
'expression : FUNC LPAREN expression RPAREN'
if t[1] == 'sin':
t[0] = np.sin(t[3])
elif t[1] == 'cos':
t[0] = np.cos(t[3])
elif t[1] == 'log':
t[0] = (np.log(t[3])) / (np.log(10))
elif t[1] == 'sqrt':
t[0] = np.sqrt(t[3])
elif t[1] == 'ln':
t[0] = (np.log(t[3]))
def p_expression_group(t):
'expression : LPAREN expression RPAREN'
t[0] = t[2]
def p_expression_number(t):
'expression : NUMBER'
t[0] = t[1]
def p_expression_name(t):
'expression : NAME'
try:
t[0] = names[t[1]]
except LookupError:
print("Undefined name '%s'" % t[1])
t[0] = 0
def p_error(t):
print("Syntax error at '%s'" % t.value)
if __name__ == "__main__": # HTML is following
print() # blank line,end of headers
print("<TITLE>CGI script output</TITLE>")
import ply.yacc as yacc
parser = yacc.yacc()
# while True:
# try:
# s = input('calc > ') # Use raw_input on Python 2
# except EOFError:
# break
# parser.parse(s)
import cgi
import cgitb
cgitb.enable()
form = cgi.FieldStorage()
C1 = form.getvalue('C1')
if C1 is not None:
C1 = str(C1)
C2 = form.getvalue('C2')
if C2 is not None:
C2 = str(C2)
C3 = form.getvalue('C3')
if C3 is not None:
C3 = str(C3)
C4 = form.getvalue('C4')
if C4 is not None:
C4 = str(C4)
for C1 in C1.splitlines():
parser.parse(C1)
for C2 in C2.splitlines():
parser.parse(C2)
for C3 in C3.splitlines():
parser.parse(C3)
for C4 in C4.splitlines():
parser.parse(C4)```
解决方法
我现在找到了解决该问题的方法,它虽然不完美,但可以满足我的需求。 这是代码:
def p_statement_expr(t):
"""statement : expression"""
if line is not None:
MwGCalc.Calc2(float(t[1]))
if five is not None:
MwGCalc.Calc(float(t[1]))
在我的MwGCalc脚本中,我检查两个值的输入:5和line
它们都是不重要的变量,您可以根据自己的喜好命名它们,但是如果这样做,则也必须在此处进行更改:
if s is not None:
for line in s.splitlines ():
parser.parse ( line )
line = None
if d is not None:
for five in d.splitlines ():
parser.parse ( five )
five = None
请确保您在解析后不要忘记将这两个值都设置为None,因为它仍在定义和使用中,因此可能导致第一个值同时出现两次。 通过更改这些值,MwGCalc脚本现在可以使用以下代码进行检查:
def Calc2(t):
print ( 'Whatup',t )
def Calc(t):
print ( 'Hi',t )
它定义了我在第一个脚本中使用的那些变量,然后引用它们。 然后可以通过将浮点值t分配给另一个变量来进行进一步处理,然后由我使用它来计算一些东西。
请确保不要使用't [1]',因为发送给其他脚本后无法将其下标,而只是't'。
这是我的脚本输出,其中s使用“ 4 by 4”,d使用“ 4 by 5”:
Whatup 16.0
Hi 20.0
希望它可能对某人有帮助,对我有很大帮助。
今天愉快。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。