You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2011/10/16 01:24:33 UTC

[lucy-commits] svn commit: r1183767 - in /incubator/lucy/branches/clownfish_lemon/clownfish: src/CFCLexHeader.l src/CFCParseHeader.y t/108-composite_type.t t/600-parser.t

Author: marvin
Date: Sat Oct 15 23:24:33 2011
New Revision: 1183767

URL: http://svn.apache.org/viewvc?rev=1183767&view=rev
Log:
Add support for composite types to Lemon-based parser.

Modified:
    incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l
    incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y
    incubator/lucy/branches/clownfish_lemon/clownfish/t/108-composite_type.t
    incubator/lucy/branches/clownfish_lemon/clownfish/t/600-parser.t

Modified: incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l
URL: http://svn.apache.org/viewvc/incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l?rev=1183767&r1=1183766&r2=1183767&view=diff
==============================================================================
--- incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l (original)
+++ incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l Sat Oct 15 23:24:33 2011
@@ -74,6 +74,12 @@ va_list    { PARSE(CFC_TOKENTYPE_VA_LIST
                 PARSE(CFC_TOKENTYPE_OBJECT_TYPE_SPECIFIER, NULL); 
            }
 [*]        { PARSE(CFC_TOKENTYPE_ASTERISK, NULL); }
+[\[]       { PARSE(CFC_TOKENTYPE_LEFT_SQUARE_BRACKET, NULL); }
+[\]]       { PARSE(CFC_TOKENTYPE_RIGHT_SQUARE_BRACKET, NULL); }
+-?[0-9]+   {
+                S_save_yytext();
+                PARSE(CFC_TOKENTYPE_INTEGER_LITERAL, NULL); 
+           }
 
 [ \t\r\n]  /* Skip whitespace. */
 .          { 

Modified: incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y
URL: http://svn.apache.org/viewvc/incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y?rev=1183767&r1=1183766&r2=1183767&view=diff
==============================================================================
--- incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y (original)
+++ incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y Sat Oct 15 23:24:33 2011
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <stdlib.h>
 #include "CFC.h"
 #ifndef true
   #define true 1
@@ -63,11 +64,25 @@ static const char KW_DOUBLE[]   = "doubl
     state->cap = 0;
 }
 
-result ::= simple_type(A).
+result ::= type(A).
 {
     state->result = A;
 }
 
+type(A) ::= simple_type(B).            { A = B; }
+type(A) ::= composite_type(B).         { A = B; }
+
+composite_type(A) ::= simple_type(B) asterisk_postfix(C).
+{
+    int indirection = strlen(C);
+    A = (CFCBase*)CFCType_new_composite(0, (CFCType*)B, indirection, NULL);
+}
+
+composite_type(A) ::= simple_type(B) array_postfix(C).
+{
+    A = (CFCBase*)CFCType_new_composite(0, (CFCType*)B, 0, C);
+}
+
 simple_type(A) ::= object_type(B).  { A = B; }
 simple_type(A) ::= void_type(B).    { A = B; }
 simple_type(A) ::= float_type(B).   { A = B; }
@@ -90,11 +105,18 @@ void_type(A) ::= void_type_specifier.
 %type object_type_specifier         {char*}
 %type type_qualifier                {int}
 %type type_qualifier_list           {int}
+%type integer_literal               {long}
+%type asterisk_postfix              {char*}
+%type array_postfix                 {char*}
+%type array_postfix_elem            {char*}
 %destructor float_type_specifier        { }
 %destructor integer_type_specifier      { }
 %destructor object_type_specifier       { FREEMEM($$); }
 %destructor type_qualifier              { }
 %destructor type_qualifier_list         { }
+%destructor asterisk_postfix            { FREEMEM($$); }
+%destructor array_postfix               { FREEMEM($$); }
+%destructor array_postfix_elem          { FREEMEM($$); }
 
 void_type_specifier ::= VOID.
 va_list_specifier         ::= VA_LIST.
@@ -172,3 +194,37 @@ type_qualifier_list(A) ::= type_qualifie
 type_qualifier_list(A) ::= type_qualifier_list INCREMENTED. { A |= CFCTYPE_INCREMENTED; }
 type_qualifier_list(A) ::= type_qualifier_list DECREMENTED. { A |= CFCTYPE_DECREMENTED; }
 
+asterisk_postfix(A) ::= ASTERISK.
+{
+    A = CFCUtil_strdup("*");
+}
+asterisk_postfix(A) ::= asterisk_postfix(B) ASTERISK.
+{
+    A = CFCUtil_cat(B, "*", NULL);
+}
+
+array_postfix_elem(A) ::= LEFT_SQUARE_BRACKET RIGHT_SQUARE_BRACKET.
+{
+    A = CFCUtil_strdup("[]");
+}
+array_postfix_elem(A) ::= LEFT_SQUARE_BRACKET integer_literal(B) RIGHT_SQUARE_BRACKET.
+{
+    char buffer[30];
+    sprintf(buffer, "%ld", B);
+    A = CFCUtil_cat(CFCUtil_strdup(""), "[", buffer, "]", NULL);
+}
+
+array_postfix(A) ::= array_postfix_elem(B). 
+{ 
+    A = B; 
+}
+array_postfix(A) ::= array_postfix(B) array_postfix_elem(C).
+{
+    A = CFCUtil_cat(B, C, NULL);
+}
+
+integer_literal(A) ::= INTEGER_LITERAL.
+{
+    A = strtol(CFCParser_current_state->text, NULL, 10);
+}
+

Modified: incubator/lucy/branches/clownfish_lemon/clownfish/t/108-composite_type.t
URL: http://svn.apache.org/viewvc/incubator/lucy/branches/clownfish_lemon/clownfish/t/108-composite_type.t?rev=1183767&r1=1183766&r2=1183767&view=diff
==============================================================================
--- incubator/lucy/branches/clownfish_lemon/clownfish/t/108-composite_type.t (original)
+++ incubator/lucy/branches/clownfish_lemon/clownfish/t/108-composite_type.t Sat Oct 15 23:24:33 2011
@@ -16,16 +16,12 @@
 use strict;
 use warnings;
 
-use Test::More tests => 24;
+use Test::More tests => 23;
 use Clownfish::Type;
 use Clownfish::Parser;
 
 my $parser = Clownfish::Parser->new;
 
-is( $parser->type_postfix($_), $_, "postfix: $_" )
-    for ( '[]', '[32]', '*' );
-is( $parser->type_postfix('[ 3 ]'), '[5]', "type_postfix: [ 76 ]" );
-
 my @composite_type_strings = (
     qw(
         char*
@@ -33,6 +29,8 @@ my @composite_type_strings = (
         char***
         int32_t*
         Obj**
+        int8_t[]
+        int8_t[1]
         neato_method_t[]
         neato_method_t[1]
         multi_dimensional_t[1][10]
@@ -40,10 +38,11 @@ my @composite_type_strings = (
     'char * * ',
     'const Obj**',
     'const void*',
+    'int8_t[ 3 ]',
 );
 
 for my $input (@composite_type_strings) {
-    my $type = $parser->type($input);
+    my $type = $parser->parse($input);
     ok( $type && $type->is_composite, $input );
 }
 
@@ -74,20 +73,20 @@ ok( !$composite_type->equals($bar_compos
     "equals spoiled by different child"
 );
 
-my $foo_array = $parser->type("foo_t[]")
+my $foo_array = $parser->parse("foo_t[]")
     or die "Can't parse foo_t[]";
 is( $foo_array->get_array, '[]', "get_array" );
 unlike( $foo_array->to_c, qr/\[\]/, "array subscripts not included by to_c" );
 
-my $foo_array_array = $parser->type("foo_t[][]")
+my $foo_array_array = $parser->parse("foo_t[][]")
     or die "Can't parse foo_t[][]";
 ok( !$foo_array->equals($foo_array_array),
     "equals spoiled by different array postfixes"
 );
 
-my $foo_star = $parser->type("foo_t*")
+my $foo_star = $parser->parse("foo_t*")
     or die "Can't parse foo_t*";
-my $foo_star_star = $parser->type("foo_t**")
+my $foo_star_star = $parser->parse("foo_t**")
     or die "Can't parse foo_t**";
 ok( !$foo_star->equals($foo_star_star),
     "equals spoiled by different levels of indirection" );

Modified: incubator/lucy/branches/clownfish_lemon/clownfish/t/600-parser.t
URL: http://svn.apache.org/viewvc/incubator/lucy/branches/clownfish_lemon/clownfish/t/600-parser.t?rev=1183767&r1=1183766&r2=1183767&view=diff
==============================================================================
--- incubator/lucy/branches/clownfish_lemon/clownfish/t/600-parser.t (original)
+++ incubator/lucy/branches/clownfish_lemon/clownfish/t/600-parser.t Sat Oct 15 23:24:33 2011
@@ -16,7 +16,7 @@
 use strict;
 use warnings;
 
-use Test::More tests => 107;
+use Test::More tests => 103;
 
 BEGIN { use_ok('Clownfish::Parser') }
 
@@ -59,13 +59,9 @@ is( $parser->type_qualifier($_), $_, "ty
 is( $parser->exposure_specifier($_), $_, "exposure_specifier $_" )
     for qw( public private parcel );
 
-is( $parser->type_postfix($_), $_, "postfix: $_" )
-    for ( '[]', '[A_CONSTANT]', '*' );
-is( $parser->type_postfix('[ FOO ]'), '[FOO]', "type_postfix: [ FOO ]" );
-
-isa_ok( $parser->type($_), "Clownfish::Type", "type $_" )
+isa_ok( $parser->parse($_), "Clownfish::Type", "type $_" )
     for ( 'const char *', 'Obj*', 'i32_t', 'char[]', 'long[1]',
-    'i64_t[FOO]' );
+    'i64_t[30]' );
 
 is( $parser->declarator($_), $_, "declarator: $_" )
     for ( 'foo', 'bar_bar_bar' );