解析特殊字符旁边的关键字(pyparsing)

Parsing keyword next to special character (pyparsing)

如何使用 pyparsing 匹配紧接在特殊字符(如“{”或“}”)之前或之后的关键字?下面的代码显示我的关键字 "msg" 不匹配,除非它前面有空格(或在开头):

import pyparsing as pp

openBrace = pp.Suppress(pp.Keyword("{"))
closeBrace = pp.Suppress(pp.Keyword("}"))
messageKw = pp.Keyword("msg")
messageExpr = pp.Forward()
messageExpr << messageKw + openBrace +\
                pp.ZeroOrMore(messageExpr) + closeBrace

try:
    result = messageExpr.parseString("msg { msg { } }")
    print result.dump(), "\n"
    result = messageExpr.parseString("msg {msg { } }")
    print result.dump()
except pp.ParseException as pe:
    print pe, "\n", "Text: ", pe.line

我确定有办法做到这一点,但我一直找不到它。

提前致谢

openBrace = pp.Suppress(pp.Keyword("{"))
closeBrace = pp.Suppress(pp.Keyword("}"))

应该是:

openBrace = pp.Suppress(pp.Literal("{"))
closeBrace = pp.Suppress(pp.Literal("}"))

甚至只是:

openBrace = pp.Suppress("{")
closeBrace = pp.Suppress("}")

(大多数 pyparsing classes 会自动将字符串参数 "arg" 提升为 Literal("arg")。)

当我有很多标点符号的解析器时,我会把它们压缩成类似这样的东西,而不是像这样一大堆丑陋的语句:

OBRACE, CBRACE, OPAR, CPAR, SEMI, COMMA = map(pp.Suppress, "{}();,")

您看到的问题是 Keyword 查看紧邻的字符,以确保当前字符串在真正嵌入更大的类似标识符的字符串时不会被意外匹配。在 Keyword('{') 中,这仅在没有可能被混淆为较大单词的一部分的相邻字符时才有效。由于“{”本身并不是真正典型的关键字字符,因此使用 Keyword('{') 并不是很好地使用 class。

仅对可能被误解为标识符的字符串使用 Keyword。对于不在典型关键字字符集中的匹配字符("keyword characters" 我的意思是字母数字 + '_'),使用 Literal.