From c2b4d5cb19b22eee73c0e0bc7b5e81b32fe1f41c Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Sat, 14 Jun 2014 17:54:20 +0000 Subject: [PATCH] CGrammar: Now parses int *a[10] and int (*a)[10] and such --- PBot/VERSION.pm | 4 ++-- modules/c2english/CGrammar.pm | 28 ++++++++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/PBot/VERSION.pm b/PBot/VERSION.pm index d00ed01a..b8632a0d 100644 --- a/PBot/VERSION.pm +++ b/PBot/VERSION.pm @@ -13,8 +13,8 @@ use warnings; # These are set automatically by the build/commit script use constant { BUILD_NAME => "PBot", - BUILD_REVISION => 636, - BUILD_DATE => "2014-06-12", + BUILD_REVISION => 637, + BUILD_DATE => "2014-06-14", }; 1; diff --git a/modules/c2english/CGrammar.pm b/modules/c2english/CGrammar.pm index 0f46919d..5b4c7a93 100644 --- a/modules/c2english/CGrammar.pm +++ b/modules/c2english/CGrammar.pm @@ -7,7 +7,6 @@ # 2. preprocessor directives. (getting there) # 4. functions to handle the nesting levels (ordinal number generator and CPP stack) # 6. change returns to prints where appropriate. -# 7. syntax for int *p[10] vs int (*p)[10] vs int *(*p)[10] { my @defined_types = ('`FILE`'); @@ -658,6 +657,21 @@ declaration: $first_initializer = shift @args // ''; } + if($first_initializer !~ /^initialized/) { + if($first_qualifier =~ /\|initialized/) { + my ($fq, $fi) = split /\|/, $first_qualifier, 2; + $first_qualifier .= " $fq"; + $first_initializer = $fi; + } elsif($first_initializer =~ /\|initialized/) { + my ($fq, $fi) = split /\|/, $first_initializer, 2; + $first_qualifier .= " $fq"; + $first_initializer = $fi; + } else { + $first_qualifier .= " $first_initializer"; + $first_initializer = ''; + } + } + my @initializers; if($first_initializer) { push @initializers, [ $first_identifier, $first_initializer ]; @@ -1025,17 +1039,7 @@ direct_declarator: } } | '(' declarator ')' array_declarator(s) - { - my ($prefix, $name) = split / ([^ ]+)$/, $item{'declarator'}; - if(not defined $name) { - $name = $prefix; - $prefix = undef; - } else { - $prefix .= ' '; - } - - $return = "$name|$prefix" . join('', @{$item{'array_declarator(s)'}}); - } + { $return = "$item{declarator} " . join('', @{$item{'array_declarator(s)'}}); } | '(' declarator array_declarator(s) ')' { $return = $item{'declarator'} . join('', @{$item{'array_declarator(s)'}}) } | '(' declarator ')'