如何使用Instaparse处理可选部件?

时间:2016-04-08 12:25:16

标签: clojure

我想解析以下来源:

<td></td>

问题是,使用列表可以是apear但不能。我试图将用途更改为[使用]但是这会给我一个emtpy使用列表,即使存在一个。

BTW:我的语法看起来像这样:

unit SystemGeneralAR;
interface
    uses AbstractRecord, OracleData, systemgeneral_auto_gen;
    type
      TSystemGeneral = class(TSystemGeneralbase)
      public
         destructor Destroy; override;
         class function All(): ISystemGeneralResultSet; reintroduce;
     end; 
 implementation 
      uses testa, testb; 
 end.

生成的使用*的解析树如下所示:

 S = unit-decl interface<any>*implementation<any>*<'.'>

 unit-decl = 'unit'<space>*identifier<space>*<';'>
 unit-name = identifier

 interface = <interface_dec> uses
 interface_dec = <space>*'interface'<space>*

 implementation = <'implementation'>impl_body
 impl_body = uses

 uses = <space>*<'uses'><space>*uses_list
 uses_list = (uses_element<','>)*(uses_element<';'>)
 uses_element = <space>*identifier<space>*

 identifier = #'[A-Za-z|_]+'
 space = #' '
 any = #'[A-Za-z|_| |,|;|=|(|)|:]'

只需使用它就像:

 [:S [:unit-decl "unit" [:identifier "SystemGeneralAR"]] [:interface] 
 [:implementation [:impl_body]]]

1 个答案:

答案 0 :(得分:0)

罗杰

这是一个有效的,经过测试的用例语法。我尝试使用你拥有的但它失败并且看起来不完整。以下是两个示例,用于演示条件存在时的可选外观:

S = A <space> B [<space> optC]

A = "a"

B = "b"

C = "c"

optC = C

space = #' '

以下是两个输出:

;input 1 = "a b"
;produces

=> [:S [:A "a"] [:B "b"]]

input 2 = "a b c"
;produces

=> [:S [:A "a"] [:B "b"] [:optC [:C "c"]]]

用你的语法。正如我所说,我遇到了麻烦,因为它似乎没有完全定义,但一般来说:

(* If you change this *)

interface = <interface_dec> uses

(* to this, you should get similar results *)

interface = <interface_dec> [uses] 

如果这不起作用,那么您需要提供一个语法,该语法与提供的输入样本一起使用,因为它们似乎不同步。