如何在simpleparse中识别关键字?

时间:2008-11-18 07:12:39

标签: python parsing

我一直在尝试使用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 个答案:

答案 0 :(得分:1)

语法目前含糊不清。如果“移动到移动C到D”是两个语句,或者一个语句具有特定命名的目的地,则无法解析。

你有两个答案。你可能不喜欢。

  1. 您明确地使您的WORD与任何保留字不匹配。也就是说,您明确禁止匹配MOVE或TO。这相当于说“MOVE不是有效的参数名称”。这使“MOVE TL TO TM TN TO”出错。

  2. 您可以修改语法,以便了解语句的结束位置。您可以添加逗号“移动AA到BB,CC移动TM到TN,TO,TP”。您可以在语句末尾添加分号或空行。你可以要求MOVE是缩进最少的,比如Python。