语法验证实用程序

Utility for syntax validation

我有一个非常独特的情况,其中只需要为 AND、OR、NOT 验证语法,而无需使用任何编程进行任何赋值 language.Any 直接实用程序将是 great.Any 表示赞赏的建议。

例子 q or not (p and r) - 有效 q 不是或 p 或 q - 无效

我的出发点是上面的任何建议 this.It 解析,但我试图找出一种方法来查找有效与无效。

import pyparsing as pp

operator = pp.Regex("AND|OR|NOT").setName("operator")
number = pp.Regex(r"[+-]?\d+(:?\.\d*)?(:?[eE][+-]?\d+)?")
identifier = pp.Word(pp.alphas, pp.alphanums + "_")
comparison_term = identifier | number 
condition = pp.Group(comparison_term + operator + comparison_term)

expr = pp.operatorPrecedence(condition,[
                            ("NOT", 1, pp.opAssoc.RIGHT, ),
                            ("AND", 2, pp.opAssoc.LEFT, ),
                            ("OR", 2, pp.opAssoc.LEFT, ),
                            ])

#x=expr.parseString("P AND Q OR X AND Y")
x=expr.parseString("P AND Q NOT X AND Y")

print(x)

我想你是想在这里将运算符定义为:

operator = pp.oneOf("< > = <= >= !=").setName("operator")

为了让您的解析器匹配您的输入字符串,condition 还必须只接受普通标识符:

condition = pp.Group(comparison_term + operator + comparison_term) | identifier

现在您可以 运行 您的解析器使用 expr.runTests:

expr.runTests("""\
    P AND Q NOT X AND Y
    P AND Q AND NOT X AND Y
    P AND Q > 1000 OR NOT Z
    """, fullDump=False)

打印:

P AND Q NOT X AND Y
        ^
FAIL: Expected end of text, found 'N'  (at char 8), (line:1, col:9)

P AND Q AND NOT X AND Y
[['P', 'AND', 'Q', 'AND', ['NOT', 'X'], 'AND', 'Y']]

P AND Q > 1000 OR NOT Z
[[['P', 'AND', ['Q', '>', '1000']], 'OR', ['NOT', 'Z']]

编辑:要捕获解析错误,您不会使用 运行Tests(尽管 运行Tests 对解析器测试很有用)。相反,您会在 Python try-except 块内调用 parseString,并捕获 ParseExceptions:

try:
    results = expr.parseString(user_input)
except ParseException as pe:
    print("error at", pe.loc)

ParseExceptions 具有有用的属性,如 linenocollocline。您可以在此处阅读有关如何使用它们的更多信息 https://pyparsing-docs.readthedocs.io/en/pyparsing_2.4.6/pyparsing.html?highlight=ParseException#pyparsing.ParseException .