无法在python中分析EBNF公式

2024-06-24 13:28:41 发布

您现在位置:Python中文网/ 问答频道 /正文

import argparse
from parglare import Grammar
from parglare import Parser

formula = r"""
Formula : Number | (Formula Sign Formula)
Number  : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
Sign    : '+' | '-'
"""

grammar = Grammar.from_string(formula)
parser = Parser(grammar, build_tree=True, prefer_shifts=True)
parser = argparse.ArgumentParser()

parser.add_argument('expression')

args = parser.parse_args()

expression = args.expression

print(parser.parse_args(expression))

Traceback

task that I need to do

请帮助我找到使用EBNF func编码的正常示例或解释我的错误


Tags: fromimporttrueparsernumberargparseargsexpression
1条回答
网友
1楼 · 发布于 2024-06-24 13:28:41

通常,我不会回答明显是家庭作业的问题,但在这种情况下,我认为你离目标太远了,我们会浪费太多时间引导你重新调整。看看你是否可以用这个来找出你应该如何解决这个问题

import sys

def process( accum, op, number ):
    if op == '+':
        return accum + number
    elif op == '-':
        return accum - number
    elif op == '0':
        return number

def parse(expression):
    if not expression:
        return (False, None)
    accum = 0
    number = 0
    pending = '0'
    for c in expression:
        if c.isdigit():
            if number is None:
                number = 0
            number = number * 10 + int(c)
        elif c in "+-":
            if number is None:
                return False, None
            accum = process( accum, pending, number )
            pending = c
            number = None
        else:
            return False, None
    return True, process( accum, pending, number )

if len(sys.argv) > 1:
    print(parse( sys.argv[1] ) )
else:
    print(parse( "1+2+4-2+5-1" ))
    print(parse( "123" ))
    print(parse( "hello+12" ))
    print(parse( "2++12-3" ))
    print(parse( '' ))

相关问题 更多 >