pyparsing:是否可以将lineno / col(或startloc / endloc)添加到所有令牌?

时间:2017-04-18 07:48:23

标签: python pyparsing

解析模式后需要更好的错误报告,例如

enum MyEnum {
  Key1,
  Key2,
  Key3
}

table Test {
  field1: MyEnum = MyEnum.Key1;
  field2: MyEnum = MyEnum.WrongKey;
}

我想报告找不到MyEnum.WrongKey,但我也想要提取位置(line& col) 这里https://github.com/bog-dan-ro/flatbuffers/blob/pyfbsc/bin/fbsc.py是完整的解析器srcs

2 个答案:

答案 0 :(得分:1)

您可以尝试定义解析器,以便MyEnum.WrongKey不解析。然后打印出解析失败的位置:

try:
    your_parser.parseString(your_schema)
except ParseException as pe:
   print(pe)
   print("at column: {}".format(pe.col))

请参阅documentation for ParseException

答案 1 :(得分:0)

您可以使用pyparsing的locatedExpr帮助程序包装任何表达式。来自在线文档(https://pythonhosted.org/pyparsing/pyparsing-module.html#locatedExpr):

示例:

wd = Word(alphas)
for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"):
    print(match)

打印:

[[0, 'ljsdf', 5]]
[[8, 'lksdjjf', 15]]
[[18, 'lkkjj', 23]]