我想解析以下来源:
<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]]]
答案 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]
如果这不起作用,那么您需要提供一个语法,该语法与提供的输入样本一起使用,因为它们似乎不同步。