语法验证实用程序
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 具有有用的属性,如 lineno
、col
、loc
和 line
。您可以在此处阅读有关如何使用它们的更多信息 https://pyparsing-docs.readthedocs.io/en/pyparsing_2.4.6/pyparsing.html?highlight=ParseException#pyparsing.ParseException .
我有一个非常独特的情况,其中只需要为 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 具有有用的属性,如 lineno
、col
、loc
和 line
。您可以在此处阅读有关如何使用它们的更多信息 https://pyparsing-docs.readthedocs.io/en/pyparsing_2.4.6/pyparsing.html?highlight=ParseException#pyparsing.ParseException .