Ladies_Man

#COMPLR Lab9 parser.y (add tabs)

Jun 29th, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.90 KB | None | 0 0
  1.  
  2. %{
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "lexer.h"
  7.  
  8. #define TYPENAME_FLOAT "float"
  9. #define TYPENAME_INT "int"
  10.  
  11. #define MEM(size) ((char *)malloc(sizeof(char) * (size + 1)))
  12. %}
  13.  
  14. %define api.pure
  15. %locations
  16. %lex-param {yyscan_t scanner}
  17. %parse-param {yyscan_t scanner}
  18.  
  19. %union {
  20.     char *string;
  21.     struct number {
  22.         char *typeName;
  23.         union numData {
  24.             int numInt;
  25.             float numFloat;
  26.         } numData;
  27.     } number;
  28. }
  29.  
  30. %token <string> String
  31. %token <number> Number
  32. %token ValTrue ValFalse ValNull
  33. %left ObjBeg ObjEnd ArrBeg ArrEnd SymLBreak SymTab
  34. %left SymComma
  35. %left SymColon
  36. %start Start
  37.  
  38. %type<string> Object Array ObjBeg ObjEnd ArrBeg ArrEnd Members Pair Elements Value x
  39.  
  40. %{
  41. int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param , yyscan_t scanner);
  42. void yyerror(YYLTYPE *yylloc, yyscan_t scanner, char *msg);
  43. %}
  44.  
  45. //  $$          $1        $2            $3             $4        $5    
  46. //  Members     ObjBeg    x             Members        ObjEnd    x
  47. //              "{\t"     %s            %s             " }"      %s
  48. //              3+        strlen($2)+   strlen($3)+    2+        strlen($5)
  49.  
  50. %%
  51.  
  52. Start:      Object                      { printf("%s\n",$1); }
  53.     ;
  54.  
  55. Object:     ObjBeg x ObjEnd x           { $$ = MEM(1+strlen($2)+1+strlen($4)); sprintf($$, "{%s}%s", $2,$4); }     
  56.     |       ObjBeg x Members ObjEnd x   { $$ = MEM(3+strlen($2)+strlen($3)+2+strlen($5)); sprintf($$,"{\t%s%s }%s", $2,$3,$5); }   
  57.     ;
  58.  
  59. Members:    Pair                        { $$ = $1; }/inc indent*/
  60.     |       Pair SymComma x Members     { $$ = MEM(2+strlen($1)+2+strlen($3)+strlen($4)); sprintf($$,"\t%s, %s%s", $1,$3,$4); }/*inc indent*/
  61.     ;
  62.  
  63. Pair:       String x SymColon x Value   { $$ = MEM(strlen($1)+strlen($2)+3+strlen($4)+strlen($5)); sprintf($$,"%s%s : %s%s", $1,$2,$4,$5); }
  64.     ;
  65.  
  66. Array:      ArrBeg x ArrEnd x           { $$ = MEM(1+strlen($2)+1+strlen($4)); sprintf($$,"[%s]%s", $2,$4); }
  67.     |       ArrBeg x Elements ArrEnd x  { $$ = MEM(2+strlen($2)+strlen($3)+2+strlen($5)); sprintf($$,"[ %s%s ]%s", $2,$3,$5); }
  68.     ;
  69.  
  70. Elements:   Value                       { $$ = $1; }
  71.     |       Value SymComma x Elements   { $$ = MEM(strlen($1)+2+strlen($3)+strlen($4)); sprintf($$,"%s, %s%s",$1,$3,$4); }
  72.     ;
  73.  
  74. Value:      Object                      { $$ = $1; }
  75.     |       Array                       { $$ = $1; }
  76.     |       String x                    { $$ = MEM(strlen(yylval.string)+strlen($2)); sprintf($$,"%s%s", yylval.string, $2); }
  77.     |       Number x                    {
  78.                                             if (0 == strcmp(yylval.number.typeName, TYPENAME_INT)) {
  79.                                                 $$ = malloc(sizeof(int) * 1 + sizeof(char*) * (strlen($2)+1));
  80.                                                 sprintf($$, "%d%s", yylval.number.numData.numInt, $2);
  81.                                             } else {
  82.                                                 $$ = malloc(sizeof(float) * 1 + sizeof(char*) * (strlen($2)+1));
  83.                                                 sprintf($$, "%f%s", yylval.number.numData.numFloat, $2);
  84.                                             }
  85.                                         }
  86.     |       ValTrue x                   { $$ = MEM(4+strlen($2)); sprintf($$, "true%s",  $2); }
  87.     |       ValFalse x                  { $$ = MEM(5+strlen($2)); sprintf($$, "false%s", $2); }
  88.     |       ValNull x                   { $$ = MEM(4+strlen($2)); sprintf($$, "null%s",  $2); }
  89.     ;
  90.  
  91. x:                                      { $$ = ""; }
  92.     |       SymLBreak x                 { $$ = MEM(2+strlen($2)); sprintf($$,"\n%s", $2); }
  93.     |       SymTab x                    { $$ = MEM(2+strlen($2)); sprintf($$,"\t%s", $2); }
  94.     ;
  95.  
  96. %%    
  97.  
  98. int main()
  99. {
  100.     char * buffer = 0;
  101.     long length;
  102.     FILE * f = fopen ("input.txt", "rb");
  103.  
  104.     if (f) {
  105.         fseek (f, 0, SEEK_END);
  106.         length = ftell (f);
  107.         fseek (f, 0, SEEK_SET);
  108.         buffer = malloc (length);
  109.         if (buffer)
  110.             fread (buffer, 1, length, f);
  111.         fclose (f);
  112.     }
  113.  
  114.     if (buffer) {
  115.         printf("===============================================\n");
  116.         printf("----------------- INPUT JSON ------------------\n");
  117.         printf("===============================================\n");
  118.         printf("%s\n", buffer);
  119.         printf("===============================================\n");
  120.         printf("---------------- OUTPUT JSON ------------------\n");
  121.         printf("===============================================\n");
  122.  
  123.         //Weak formatter
  124.         yyscan_t scanner;
  125.         struct Extra extra;
  126.         init_scanner(buffer, &scanner, &extra);
  127.         yyparse(scanner);
  128.         destroy_scanner(scanner);
  129.  
  130.         free(buffer);
  131.     }
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment