[antlr-interest] tree construction that cannot be done with rewriterule
Sam Harwell
sharwell at pixelminegames.com
Tue Apr 7 11:33:19 PDT 2009
This is probably not perfect (haven't run it) but it should get you
close at the least. Based on the CSharp2 target.
@parser::members
{
CommonTree BuildProxyOptionTree(
SortedList<int,List<CommonTree>> options )
{
object root = adaptor.Nil();
foreach ( KeyValuePair<int,List<CommonTree>> pair in
options )
{
CommonTree child = adaptor.Create( NUM,
pair.Key.ToString() );
foreach ( CommonTree subchild in pair.Value )
adaptor.AddChild( child, subchild );
adaptor.AddChild( root, child );
}
return root;
}
}
proxyConfig
@init
{
SortedList<int,List<CommonTree>> options = new
SortedList<int,List<CommonTree>>();
}
: 'proxy-list' IDENT
( proxyConfigSt
{
List<CommonTree> idlist;
if ( !options.TryGetValue(
$proxyConfigSt.id, out idlist ) )
{
idlist = new List<CommonTree>();
options.Add( $proxyConfigSt.id,
idlist );
}
idlist.Add( $proxyConfigSt.tree );
}
)+
-> ^(IDENT {BuildProxyOptionTree(options)})
;
proxyConfigSt returns [int id]
: 'id'! NUM! {$id = int.Parse($NUM.text);}
proxyConfigOption
;
proxyConfigOption
: 'cipher'^ proxyConfigCipher
| 'queue-delay'^ NUM
| 'cert'^ IDENT
| 'rsakey'^ IDENT
| 'vip'^ 'address'! IP
;
proxyConfigCipher
: CIPHER^ 'vip'! IP NUM
;
Sam
From: antlr-interest-bounces at antlr.org
[mailto:antlr-interest-bounces at antlr.org] On Behalf Of Han Chen
Sent: Tuesday, April 07, 2009 12:28 PM
To: antlr-interest at antlr.org
Subject: [antlr-interest] tree construction that cannot be done with
rewriterule
I am just started to explore ANTLR v3. After reading the grammar manual,
tree construction tutorial, I have a hard problem (at least for me it
is) regarding the tree construction
Given the following input.
proxy-list testList
id 2 cipher rsa-with-rc4-128-md5 vip 192.168.0.1 12345
id 2 queue-delay 400
id 3 cipher rsa-with-rc4-128-md5 vip 192.168.0.2 12345
id 2 cipher rsa-with-rc4-128-sha vip 192.168.0.3 12345
id 2 cert testcert
id 3 cert testcert
id 2 rsakey testkey
id 2 cipher rsa-with-3des-ede-cbc-sha vip 192.168.0.4 12345
id 3 vip address 192.168.0.5
id 2 vip address 192.168.0.6
id 3 rsakey testkey
the statement with the same 'id' is not in any specific order. However,
I would like to construct a tree that put all of the ID specific
information as a subroot node and the proxy-list name as the root node
of the tree. For example, the above configuration, I would like the
resulting tree look similar to the following
^(testList ^(2 ^( cipher ^(rsa-with-rc4-128-md5 192.168.0.1 12345)
^(rsa-with-rc4-128-sha 192.168.0.3 12345) ^(rsa-with-3des-ede-cbc-sha
192.168.0.4 12345) ) ^(queue-delay 400) ^(cert testcert) ^(rsakey
testkey) ^(vip 192.168.0.6) ) ^(3 ^( cipher ^(rsa-with-rc4-128-md5
192.168.0.2 12345) ) ^(cert testcert) ^(vip 192.168.0.5) ^(rsakey
testkey) ) )
The order of the child node should be the same as the parse sequence,
but group under the same subroot node accordingly.
I have the following test grammar, but using rewrite rule, I don't know
how to construct the desired tree forementioned
proxyConfig: 'proxy-list' IDENT proxyConfigSt+;
proxyConfigSt: 'id' NUM proxyConfigOption;
proxyConfigOption:
'cipher' CIPHER 'vip' IP NUM |
'queue-delay' NUM |
'cert' IDENT |
'rsakey' IDENT |
'vip' 'address' IP;
IDENT: (~WS)+;
IP: NUM '.' NUM '.' NUM '.' NUM;
NUM: '0'..'9'+;
fragment
WS: (' ' | '\t' | '\r' | '\n')+;
I could, just using action, create an appropriate data structure to
represent the above, and then go through the data structure after the
rule is complete to build a tree. But the order within the same ID
config is lost, I can add more detail into the data structure and then
sort it, but that's a little too cumbersome. At the end, I just want the
output look like the following. If I have the desired AST constructed, a
simple depth-first walk would result the correct output.
proxy-list testList
id 2 cipher rsa-with-rc4-128-md5 vip 192.168.0.1 12345
id 2 queue-delay 400
id 2 cipher rsa-with-rc4-128-sha vip 192.168.0.3 12345
id 2 cert testcert
id 2 rsakey testkey
id 2 cipher rsa-with-3des-ede-cbc-sha vip 192.168.0.4 12345
id 2 vip address 192.168.0.6
id 3 cipher rsa-with-rc4-128-md5 vip 192.168.0.2 12345
id 3 cert testcert
id 3 vip address 192.168.0.5
id 3 rsakey testkey
I could do it easily with perl using array of an array. But then I
handcoded the parser to fit my need. I am just getting and feet wet with
ANTLR and try to do the samething. Any feedback regarding how should I
approach this problem using ANTLR is greatly appreciated.
-Han
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20090407/4395e425/attachment.html
More information about the antlr-interest
mailing list