【问题标题】:Can't parse EBNF formula in python无法在python中解析EBNF公式
【发布时间】:2021-02-25 23:21:04
【问题描述】:
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 编码的正常示例或解释我的错误。

【问题讨论】:

  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。不接受站外链接和文字图片;我们需要您的问题是独立的,以符合本网站的目的。
  • 请从intro tour 重复on topic 和how to ask。要求推荐或参考被明确列为题外话;您对示例的要求不属于这里。当您正确记录您的问题时,我们也许可以帮助解决错误。
  • 这显然不是您正在运行的代码。错误说它说“掩码> =:”,这里不存在。创建 parglare.Parser 后,立即用 argparse.ArgumentParser 覆盖它。你应该使用parglare吗?还是您应该使用 EBNF 作为指南手动进行解析?
  • 顺便说一句,使用 argparse 的建议完全是假的。你只有一个参数。只需执行import sys / expression = sys.argv[1]。
  • 我应该使用 argparse ,这对我来说是导师

标签: python parsing ebnf ebnf-syntactic-exception


【解决方案1】:

通常情况下,我不会回答显然是家庭作业的问题,但在这种情况下,我认为你离题太远了,我们会浪费太多时间来引导你重新对齐。看看你是否可以用它来弄清楚你应该如何解决这个问题。

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( '' ))

【讨论】:

    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2020-04-15
    相关资源
    最近更新 更多