簡體   English   中英

Pypars 簡單算術語法不捕獲表達式

[英]Pyparsing simple arithmetic grammar does not capture the expression

我目前正在為簡單的算術字符串編寫解析器,其中 ()、{} 和 [] 作為平衡括號,* 和 + 作為運算。 不知何故,我的語法似乎不對勁。 有人知道如何解決這個問題嗎? 我試圖更遞歸,但總是遇到遞歸深度錯誤。

from pyparsing import *
enclosed = Forward()
nestedParens = nestedExpr('(', ')', content=enclosed)
nestedBrackets = nestedExpr('[', ']', content=enclosed)
nestedCurlies = nestedExpr('{', '}', content=enclosed)

braexpr = Forward()
parexpr = Forward()
curexpr = Forward()

parexpr << OneOrMore(infixNotation(
    nestedParens | nestedBrackets | nestedCurlies | Word(nums),
    [
        ('*', 2, opAssoc.LEFT),
        ('+', 2, opAssoc.LEFT),
    ]
))

curexpr << OneOrMore(infixNotation(
    nestedParens | nestedBrackets | nestedCurlies | Word(nums),
    [
        ('*', 2, opAssoc.LEFT),
        ('+', 2, opAssoc.LEFT),
    ],
    Suppress('{'),
    Suppress('}')
))
braexpr << OneOrMore(infixNotation(
    nestedParens | nestedBrackets | nestedCurlies | Word(nums),
    [
        ('*', 2, opAssoc.LEFT),
        ('+', 2, opAssoc.LEFT),
    ],
    Suppress('['),
    Suppress(']')
))

enclosed << ( (nestedParens | nestedBrackets | nestedCurlies | Word(nums)) + oneOf("+ *") + (enclosed | nestedParens | nestedBrackets | nestedCurlies | Word(nums)) | parexpr | curexpr | braexpr | nestedParens | nestedBrackets | nestedCurlies | Word(nums) )

print(evaluate("[{1}+5]*({2}+[{1*3}+2] + 2])"))

如果您只有基本的算術運算符,那么我建議您不要使用 infixNotation,而是定義您自己的遞歸解析器,例如:

import pyparsing as pp
ppc = pp.pyparsing_common

operand = ppc.integer()
multop = pp.oneOf("* /")
addop = pp.oneOf("+ -")

expr = pp.Forward()
# here is where to extend the grouping symbols to include (), [], and {}
LPAR, RPAR, LBRACK, RBRACK, LBRACE, RBRACE = map(pp.Suppress, "()[]{}")
atom = operand | LPAR + expr + RPAR | LBRACK + expr + RBRACK | LBRACE + expr + RBRACE
factor = pp.Group('-' + atom) | atom
term = pp.Group(factor + (multop + factor)[1, ...]) | factor
sum = pp.Group(term + (addop + term)[1, ...]) | term
expr <<= sum

一些簡單的測試:

expr.runTests("""
1+7
1+2+4
-(1+2)*4
3*[11+14]
""", fullDump=False)

給出:

1+7
[[1, '+', 7]]

1+2+4
[[1, '+', 2, '+', 4]]

-(1+2)*4
[[['-', [1, '+', 2]], '*', 4]]

3*[11+14]
[[3, '*', [11, '+', 14]]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM