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/26 02:47:22 UTC

[lucy-commits] svn commit: r1188981 - in /incubator/lucy/branches/clownfish_lemon/clownfish/src: CFCLexHeader.l CFCParseHeader.y

Author: marvin
Date: Wed Oct 26 00:47:21 2011
New Revision: 1188981

URL: http://svn.apache.org/viewvc?rev=1188981&view=rev
Log:
Have lexer dupe every token.

Have the lexer always copy the text that it matches into a new string
(allocated from the parser's memory pool) and pass that value to the parser.
This allows us to simplify the parser somewhat.

Modified:
    incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l
    incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y

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=1188981&r1=1188980&r2=1188981&view=diff
==============================================================================
--- incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l (original)
+++ incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCLexHeader.l Wed Oct 26 00:47:21 2011
@@ -21,13 +21,9 @@
     void
     CFCParseHeader(void *header_parser, int token_type, char *value,
                    CFCParser *state);
-    /* Invoke Lemon-generated parser. */
-    #define PARSE(token_type) \
-        CFCParseHeader(CFCParser_current_parser, token_type, NULL, \
-            CFCParser_current_state)
 
-    /* Dupe yytext and invoke parser. */
-    #define SAVE_AND_PARSE(token_type) \
+    /* Dupe yytext and invoke Lemon-generated parser. */
+    #define PARSE(token_type) \
         CFCParseHeader(CFCParser_current_parser, token_type, \
 			CFCParser_dupe(CFCParser_current_state, yytext), \
 			CFCParser_current_state)
@@ -92,19 +88,19 @@ final      { PARSE(CFC_TOKENTYPE_FINAL);
 :          { PARSE(CFC_TOKENTYPE_COLON); }
 =          { PARSE(CFC_TOKENTYPE_EQUALS); }
 
--?0x[0-9A-Fa-f]+       { SAVE_AND_PARSE(CFC_TOKENTYPE_HEX_LITERAL); }
--?[0-9]+               { SAVE_AND_PARSE(CFC_TOKENTYPE_INTEGER_LITERAL); }
--?[ ]*[0-9+].[0-9]+    { SAVE_AND_PARSE(CFC_TOKENTYPE_FLOAT_LITERAL); }
-\"([^\"\\]|\\.)*\"     { SAVE_AND_PARSE(CFC_TOKENTYPE_STRING_LITERAL); }
+-?0x[0-9A-Fa-f]+       { PARSE(CFC_TOKENTYPE_HEX_LITERAL); }
+-?[0-9]+               { PARSE(CFC_TOKENTYPE_INTEGER_LITERAL); }
+-?[ ]*[0-9+].[0-9]+    { PARSE(CFC_TOKENTYPE_FLOAT_LITERAL); }
+\"([^\"\\]|\\.)*\"     { PARSE(CFC_TOKENTYPE_STRING_LITERAL); }
 
-[a-zA-Z_][a-zA-Z0-9_]* { SAVE_AND_PARSE(CFC_TOKENTYPE_IDENTIFIER); }
+[a-zA-Z_][a-zA-Z0-9_]* { PARSE(CFC_TOKENTYPE_IDENTIFIER); }
 
 __C__[[:space:]]*    { BEGIN(CBLOCK);  PARSE(CFC_TOKENTYPE_CBLOCK_START); }
 <CBLOCK>__END_C__    { BEGIN(INITIAL); PARSE(CFC_TOKENTYPE_CBLOCK_CLOSE); }
-<CBLOCK>(__END_C_[^_]|[^_])+   { SAVE_AND_PARSE(CFC_TOKENTYPE_BLOB); }
+<CBLOCK>(__END_C_[^_]|[^_])+   { PARSE(CFC_TOKENTYPE_BLOB); }
            
     /* Parse docucomments, but skip ordinary comments */
-"/**"([^*]|"*"[^/])*"*/" { SAVE_AND_PARSE(CFC_TOKENTYPE_DOCUCOMMENT); }
+"/**"([^*]|"*"[^/])*"*/" { PARSE(CFC_TOKENTYPE_DOCUCOMMENT); }
 "/*"([^*]|"*"[^/])*"*/"
 
 [ \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=1188981&r1=1188980&r2=1188981&view=diff
==============================================================================
--- incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y (original)
+++ incubator/lucy/branches/clownfish_lemon/clownfish/src/CFCParseHeader.y Wed Oct 26 00:47:21 2011
@@ -235,10 +235,6 @@ S_new_type(CFCParser *state, int flags, 
 %type param_list_elems                  {CFCParamList*}
 %type docucomment                       {CFCDocuComment*}
 %type cblock                            {CFCCBlock*}
-%type void_type_specifier               {const char*}
-%type va_list_specifier                 {const char*}
-%type float_type_specifier              {const char*}
-%type integer_type_specifier            {const char*}
 %type type_qualifier                    {int}
 %type type_qualifier_list               {int}
 
@@ -257,12 +253,6 @@ S_new_type(CFCParser *state, int flags, 
 %destructor param_list_elems                  { CFCBase_decref((CFCBase*)$$); }
 %destructor docucomment                       { CFCBase_decref((CFCBase*)$$); }
 %destructor cblock                            { CFCBase_decref((CFCBase*)$$); }
-%destructor void_type_specifier               { }
-%destructor va_list_specifier                 { }
-%destructor float_type_specifier              { }
-%destructor integer_type_specifier            { }
-%destructor type_qualifier                    { }
-%destructor type_qualifier_list               { }
 
 result ::= type(A).
 {
@@ -531,35 +521,35 @@ type(A) ::= type_qualifier_list(B) type_
     A = S_new_type(state, B, C, NULL, E);
 }
 
-void_type_specifier(A)    ::= VOID.      { A = KW_VOID; }
-va_list_specifier(A)      ::= VA_LIST.   { A = KW_VA_LIST; }
-integer_type_specifier(A) ::= INT8_T.    { A = KW_INT8_T; }
-integer_type_specifier(A) ::= INT16_T.   { A = KW_INT16_T; }
-integer_type_specifier(A) ::= INT32_T.   { A = KW_INT32_T; }
-integer_type_specifier(A) ::= INT64_T.   { A = KW_INT64_T; }
-integer_type_specifier(A) ::= UINT8_T.   { A = KW_UINT8_T; }
-integer_type_specifier(A) ::= UINT16_T.  { A = KW_UINT16_T; }
-integer_type_specifier(A) ::= UINT32_T.  { A = KW_UINT32_T; }
-integer_type_specifier(A) ::= UINT64_T.  { A = KW_UINT64_T; }
-integer_type_specifier(A) ::= CHAR.      { A = KW_CHAR; }
-integer_type_specifier(A) ::= SHORT.     { A = KW_SHORT; }
-integer_type_specifier(A) ::= INT.       { A = KW_INT; }
-integer_type_specifier(A) ::= LONG.      { A = KW_LONG; }
-integer_type_specifier(A) ::= SIZE_T.    { A = KW_SIZE_T; }
-integer_type_specifier(A) ::= BOOL_T.    { A = KW_BOOL_T; }
-float_type_specifier(A) ::= FLOAT.   { A = KW_FLOAT; }
-float_type_specifier(A) ::= DOUBLE.  { A = KW_DOUBLE; }
-
-type_name(A) ::= void_type_specifier(B).     { A = CFCParser_dupe(state, B); }
-type_name(A) ::= va_list_specifier(B).       { A = CFCParser_dupe(state, B); }
-type_name(A) ::= integer_type_specifier(B).  { A = CFCParser_dupe(state, B); }
-type_name(A) ::= float_type_specifier(B).    { A = CFCParser_dupe(state, B); }
+void_type_specifier(A)    ::= VOID(B).      { A = B; }
+va_list_specifier(A)      ::= VA_LIST(B).   { A = B; }
+integer_type_specifier(A) ::= INT8_T(B).    { A = B; }
+integer_type_specifier(A) ::= INT16_T(B).   { A = B; }
+integer_type_specifier(A) ::= INT32_T(B).   { A = B; }
+integer_type_specifier(A) ::= INT64_T(B).   { A = B; }
+integer_type_specifier(A) ::= UINT8_T(B).   { A = B; }
+integer_type_specifier(A) ::= UINT16_T(B).  { A = B; }
+integer_type_specifier(A) ::= UINT32_T(B).  { A = B; }
+integer_type_specifier(A) ::= UINT64_T(B).  { A = B; }
+integer_type_specifier(A) ::= CHAR(B).      { A = B; }
+integer_type_specifier(A) ::= SHORT(B).     { A = B; }
+integer_type_specifier(A) ::= INT(B).       { A = B; }
+integer_type_specifier(A) ::= LONG(B).      { A = B; }
+integer_type_specifier(A) ::= SIZE_T(B).    { A = B; }
+integer_type_specifier(A) ::= BOOL_T(B).    { A = B; }
+float_type_specifier(A)   ::= FLOAT(B).     { A = B; }
+float_type_specifier(A)   ::= DOUBLE(B).    { A = B; }
+
+type_name(A) ::= void_type_specifier(B).     { A = B; }
+type_name(A) ::= va_list_specifier(B).       { A = B; }
+type_name(A) ::= integer_type_specifier(B).  { A = B; }
+type_name(A) ::= float_type_specifier(B).    { A = B; }
 type_name(A) ::= identifier(B).              { A = B; }
 
-exposure_specifier(A) ::= PUBLIC.  { A = CFCParser_dupe(state, "public"); }
-exposure_specifier(A) ::= PRIVATE. { A = CFCParser_dupe(state, "private"); }
-exposure_specifier(A) ::= PARCEL.  { A = CFCParser_dupe(state, "parcel"); }
-exposure_specifier(A) ::= LOCAL.   { A = CFCParser_dupe(state, "local"); }
+exposure_specifier(A) ::= PUBLIC(B).  { A = B; }
+exposure_specifier(A) ::= PRIVATE(B). { A = B; }
+exposure_specifier(A) ::= PARCEL(B).  { A = B; }
+exposure_specifier(A) ::= LOCAL(B).   { A = B; }
 
 type_qualifier(A) ::= CONST.       { A = CFCTYPE_CONST; }
 type_qualifier(A) ::= NULLABLE.    { A = CFCTYPE_NULLABLE; }
@@ -576,15 +566,12 @@ type_qualifier_list(A) ::= type_qualifie
     A |= C;
 }
 
-declaration_modifier(A) ::= INERT.      { A = CFCParser_dupe(state, "inert"); }
-declaration_modifier(A) ::= INLINE.     { A = CFCParser_dupe(state, "inline"); }
-declaration_modifier(A) ::= ABSTRACT.   { A = CFCParser_dupe(state, "abstract"); }
-declaration_modifier(A) ::= FINAL.      { A = CFCParser_dupe(state, "final"); }
+declaration_modifier(A) ::= INERT(B).      { A = B; }
+declaration_modifier(A) ::= INLINE(B).     { A = B; }
+declaration_modifier(A) ::= ABSTRACT(B).   { A = B; }
+declaration_modifier(A) ::= FINAL(B).      { A = B; }
 
-declaration_modifier_list(A) ::= declaration_modifier(B).
-{
-    A = B;
-}
+declaration_modifier_list(A) ::= declaration_modifier(B). { A = B; }
 declaration_modifier_list(A) ::= declaration_modifier_list(B) declaration_modifier(C).
 {
     size_t size = strlen(B) + strlen(C) + 2;
@@ -592,10 +579,7 @@ declaration_modifier_list(A) ::= declara
     sprintf(A, "%s %s", B, C);
 }
 
-asterisk_postfix(A) ::= ASTERISK.
-{
-    A = CFCParser_dupe(state, "*");
-}
+asterisk_postfix(A) ::= ASTERISK(B). { A = B; }
 asterisk_postfix(A) ::= asterisk_postfix(B) ASTERISK.
 {
     size_t size = strlen(B) + 2;
@@ -614,10 +598,7 @@ array_postfix_elem(A) ::= LEFT_SQUARE_BR
     sprintf(A, "[%s]", B);
 }
 
-array_postfix(A) ::= array_postfix_elem(B). 
-{ 
-    A = B; 
-}
+array_postfix(A) ::= array_postfix_elem(B). { A = B; }
 array_postfix(A) ::= array_postfix(B) array_postfix_elem(C).
 {
     size_t size = strlen(B) + strlen(C) + 1;
@@ -629,9 +610,9 @@ scalar_constant(A) ::= hex_literal(B).  
 scalar_constant(A) ::= float_literal(B).   { A = B; }
 scalar_constant(A) ::= integer_literal(B). { A = B; }
 scalar_constant(A) ::= string_literal(B).  { A = B; }
-scalar_constant(A) ::= TRUE.     { A = CFCParser_dupe(state, "true"); }
-scalar_constant(A) ::= FALSE.    { A = CFCParser_dupe(state, "false"); }
-scalar_constant(A) ::= NULL.     { A = CFCParser_dupe(state, "NULL"); }
+scalar_constant(A) ::= TRUE(B).            { A = B; }
+scalar_constant(A) ::= FALSE(B).           { A = B; }
+scalar_constant(A) ::= NULL(B).            { A = B; }
 
 hex_literal(A)     ::= HEX_LITERAL(B).     { A = B; }
 float_literal(A)   ::= FLOAT_LITERAL(B).   { A = B; }