如何在simpleparse中使关键字可识别?

1 投票
1 回答
218 浏览
提问于 2025-04-11 19:30

我一直在尝试用simpleparse创建一个解析器。我是这样定义语法的:

<w> := [ \n]*
statement_list := statement,(w,statement)?
statement := "MOVE",w,word,w,"TO",w,(word,w)+
word := [A-Za-z],[A-Za-z0-9]*,([-]+,[A-Za-z0-9]+)*

现在如果我尝试解析一个字符串

MOVE ABC-DEF TO ABC
MOVE DDD TO XXX

第二个语句被当作第一个语句的参数来理解……这真让人失望,显然不是我想要的。我已经用pyparsing成功实现了这一点,如下所示:

word = Word(alphas,alphanums+'-')
statement = "MOVE"+word+"TO"+word
statement_list = OneOrMore(statement.setResultsName('statement',True))

有没有办法让这个在simpleparse中也能工作呢?

编辑:下面有进一步说明

我并不是想实现基于行的语法。我希望解析的是:

简单的例子

MOVE AA TO BB

更复杂的例子

MOVE AA TO BB 
           CC DD 
           EE FF

多个以上的语句

MOVE AA TO BB 
           CC
MOVE CC TO EE
MOVE EE TO FF 
           GG 
           HH IIJJK

1 个回答

2

现在这个语法有点模糊。在纸面上,你无法判断“MOVE A TO B MOVE C TO D”是两个独立的语句,还是一个语句但目的地命名得很糟糕。

你有两个解决方案。可能你都不喜欢。

  1. 你可以明确规定你的单词(WORD)不能和任何保留字(reserved word)匹配。也就是说,你特别不允许使用MOVE或TO。这样就相当于说“MOVE不是一个有效的参数名称”。这样一来,“MOVE TL TO TM TN TO”就会被视为错误。

  2. 你可以修改你的语法,这样就能清楚地知道语句在哪里结束。你可以在语句之间加上逗号,比如“MOVE AA TO BB, CC MOVE TM TO TN, TO, TP”。你也可以在语句末尾加上分号或空行。或者你可以要求MOVE这个词的缩进要最少,就像Python那样。

撰写回答