微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python parser.parse与if语句结合

如何解决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 举报,一经查实,本站将立刻删除。