在Pyparsing中的正向声明和多行嵌套结构的问题
我的目标是用我使用pyparsing创建的模式来解析以下字符串中的每个角色。我有两个嵌套的结构正在尝试解析。控制结构和宏观结构,它们跨越多条线。
"""
; Macros to verify assumptions about the data or code
table_width: MACRO
CURRENT_TABLE_WIDTH = \\1
if _NARG == 2
REDEF CURRENT_TABLE_START EQUS "\\2"
else
REDEF CURRENT_TABLE_START EQUS "._table_width\@"
{CURRENT_TABLE_START}:
endc
ENDM
"""
这些是我的解析器。它们可以从多文件项目中解析线路,直到我开始尝试解析嵌套控制和宏观结构为止。
comment_parser = (Literal(";") + SkipTo(LineEnd()))
charmap_parser = CaselessKeyword("charmap") + QuotedString("\"") + \
Literal(",").suppress() + Word(hexnums + "$") + Opt(comment_parser)
expression = infix_notation(Word(printables, exclude_chars="() ** ~ + - * / % & | ^ != == <= >= < > !"),
[
("()", 2, OpAssoc.LEFT),
("**", 2, OpAssoc.LEFT),
(one_of("~ + -"), 1, OpAssoc.RIGHT),
(one_of("* / %"), 2, OpAssoc.LEFT),
(one_of("<< >>"), 2, OpAssoc.LEFT),
(one_of("& | ^"), 2, OpAssoc.LEFT),
("+ -", 2, OpAssoc.LEFT),
("!= == <= >= < >", 2, OpAssoc.LEFT),
("&& ||", 2, OpAssoc.LEFT),
("!", 1, OpAssoc.RIGHT),
])
elif_parser = CaselessKeyword("elif") + expression
if_parser = CaselessKeyword("if") + expression
include_parser = CaselessLiteral("include") + QuotedString("\"") + Opt(comment_parser)
include_parser.add_parse_action(parse_include)
label = Word(printables, excludeChars=":") + Literal(":")
newcharmap_parser = CaselessKeyword("newcharmap") + Word(printables) + Opt(comment_parser)
numeric_assignment = Word(printables) + Literal("=") + Word(printables)
popc = CaselessKeyword("popc") + Opt(comment_parser)
pushc = CaselessKeyword("pushc") + Opt(comment_parser)
redef = CaselessKeyword("redef") + Word(printables) + \
(CaselessKeyword("equ") ^ CaselessKeyword("equs")) + \
QuotedString("\"")
all_rgbasm_parsers = Forward()
control = Forward()
macro_parser = Forward()
all_rgbasm_parsers <<= (charmap_parser ^ comment_parser ^ include_parser ^ newcharmap_parser ^
numeric_assignment ^ popc ^ pushc ^ redef ^ control ^ macro_parser ^ label)
control <<= if_parser + OneOrMore(all_rgbasm_parsers) + Opt(elif_parser ^ CaselessKeyword("else")) + \
ZeroOrMore(all_rgbasm_parsers) + CaselessKeyword("endc")
macro_parser <<= Word(printables, excludeChars=":") + Literal(":").suppress() + CaselessLiteral("macro") + \
OneOrMore(all_rgbasm_parsers) + FollowedBy(CaselessKeyword("endm"))
我希望MacRo_Parser可以通过解析上述字符串返回结果的嵌套列表。
问题是Macro_parser不起作用。我最终以预期的文本结束,发现“宏”
一个非常无用的错误消息。
如果我从 all_rgbasm_parsers
中删除 label
,我会收到一个更糟糕的消息预期的文本结束,发现'table'
我在尝试时会收到相同的错误消息为了解析这一点,
((Word(printables, excludeChars=":") + Literal(":").suppress() + CaselessLiteral("macro") +
OneOrMore(all_rgbasm_parsers) + FollowedBy(CaselessKeyword("endm"))) ^ comment_parser)
我在上面的表达式中看不到它在一条线开始时会期望新线。我可能会忽略一些东西。看来 word(PrintableS,dubludeChars =“:”)
在解析字符时不包括字符串。
我正在使用此测试对解析器
test = """
; Macros to verify assumptions about the data or code
table_width: MACRO
CURRENT_TABLE_WIDTH = \\1
if _NARG == 2
REDEF CURRENT_TABLE_START EQUS "\\2"
else
REDEF CURRENT_TABLE_START EQUS "._table_width\@"
{CURRENT_TABLE_START}:
endc
ENDM
"""
from rgbasm_parsers import all_rgbasm_parsers
all_parsers = OneOrMore(Group(all_rgbasm_parsers))
print(all_parsers.parse_string(test, parseAll=True))
进行测试 oneormore(group(all_rgbasm_parsers)))
使用不包含嵌套结构的文件,这给了我正确的结果,所以我认为该代码不是一个问题,尽管我可能错了。
问题的一部分可能是嵌套结构跨越了多行,但是预期的文本结束,发现“表”
使我成为我的事。
我认为我可能会使用远期。
有什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
发现2处错误。
第一,infix_notation 中缺少一些 one_ofs
然后“endm”没有被消耗,导致 ParseExcetion。
Found 2 things wrong.
1st, there were some missing one_ofs in the infix_notation
Then the "endm" was not being consumed resulting in a ParseExcetion.