--- a/cisco.grammar Sun Nov 15 22:52:18 2009 +0100
+++ b/cisco.grammar Thu Nov 26 09:29:42 2009 +0100
@@ -26,6 +26,7 @@
line: s_controller
| s_interface
+ | s_vrf
| indent comment
| indent cmdline
| indent emptyline
@@ -126,7 +127,7 @@
| vlan_s_range
# interface section
-iface_name: /\w+\d+[0-9\/\.:]*/
+iface_name: /\w+(-\w+)?\d+[0-9\/\.:]*/
{ $item[1] }
s_interface: "0" "interface" iface_name /\S*/ eol s_interface_l[ctx => ctx("interface", $item{iface_name}) ](s) "0" "!" eol
@@ -164,3 +165,29 @@
| "switchport" "trunk" "encapsulation" keyword
{ $arg{ctx}->{"trunk-encap"} = $item{keyword} }
| "switchport" "trunk" "allowed" "vlan" vlan_range[ctx => $arg{ctx}, key => "vlan"]
+ | "channel-group" num "mode" keyword
+ { $arg{ctx}->{"channel-group"}->{$item{num}}->{mode} = $item{keyword} }
+ | "ip" "vrf" "forwarding" word
+ { $arg{ctx}->{"ip-vrf-fwd"} = $item{word} }
+
+# vrf section
+s_vrf: "0" "ip" "vrf" keyword eol s_vrf_l[ctx => ctx("vrf", $item{keyword}) ](s) "0" "!" eol
+
+s_vrf_l: "1" s_vrf_content[ctx => $arg{ctx}] eol
+ | l_section
+
+rd_val: /\d+:\d+/
+ { $item[1] }
+
+s_vrf_content: l_description[ctx => $arg{ctx}]
+ | "rd" rd_val
+ { $arg{ctx}->{rd} = $item{rd_val} }
+ | "export" "map" keyword
+ { $arg{ctx}->{"export-map"} = $item{keyword} }
+ | "route-target" /export|import/ rd_val
+ {
+ $arg{ctx}->{"route-target"}->{$item[2]} = []
+ unless exists $arg{ctx}->{"route-target"}->{$item[2]};
+ push @{$arg{ctx}->{"route-target"}->{$item[2]}}, $item{rd_val};
+ }
+