首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Instaparse处理可选部件?

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

Stack Overflow用户
提问于 2016-04-08 12:25:15
回答 1查看 79关注 0票数 0

我想解析以下来源:

代码语言:javascript
复制
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.

问题是,使用列表可以附加,但不能。我试图将使用更改为使用,但这将给我一个emtpy使用列表,即使其中存在。

顺便说一句:我的语法是这样的:

代码语言:javascript
复制
 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|_| |,|;|=|(|)|:]'

生成的带有uses*的解析树如下所示:

代码语言:javascript
复制
 [:S [:unit-decl "unit" [:identifier "SystemGeneralAR"]] [:interface] 
 [:implementation [:impl_body]]]

如果只是使用,它看起来就像:

代码语言:javascript
复制
[:S
 [:unit-decl "unit" [:identifier "SystemGeneralAR"]]
 [:interface
  [:uses
   [:uses_list
    [:uses_element [:identifier "AbstractRecord"]]
    [:uses_element [:identifier "OracleData"]]
    [:uses_element [:identifier "systemgeneral_auto_gen"]]]]]
 [:implementation
  [:impl_body [:uses [:uses_list [:uses_element [:identifier "testa"]] [:uses_element [:identifier "testb"]]]]]]]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-09 12:11:29

罗杰

下面是一个有效的、经过测试的用例语法。我试着用你所拥有的,但它失败了,而且看上去不完整。下面是两个示例,用于演示条件存在时的可选外观:

代码语言:javascript
复制
S = A <space> B [<space> optC]

A = "a"

B = "b"

C = "c"

optC = C

space = #' '

以下是两项产出:

代码语言:javascript
复制
;input 1 = "a b"
;produces

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

input 2 = "a b c"
;produces

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

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

代码语言:javascript
复制
(* If you change this *)

interface = <interface_dec> uses

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

interface = <interface_dec> [uses] 

如果这样做不起作用,那么您将需要提供一个语法,该语法与所提供的输入示例不同步。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36499530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档