//%start_symbol complete_command //%token_prefix TOKEN_ %token_type {struct token} %extra_argument { struct parser *pstate } %include { #include "scan.h" #include "filter.h" #include #include } %name jsonp %parse_failure { fprintf(stdout,"Giving up. Parser is hopelessly lost...\n"); exit(1); } /* %syntax_error { fprintf(stdout,"syntax error on line %d, character %d, trying to recover...\n", pstate->lineno+1, pstate->pos); fprintf(stdout, "%s", pstate->line); if (pstate->line[strlen(pstate->line)] != '\n') { fprintf(stdout, "\n"); } { int i; for (i=0;ipos-1;i++) { fprintf(stdout, " "); } fprintf(stdout, "^\n"); } pstate->reset = 1; } */ list ::= jlist. jlist ::= jsons. jlist ::= jsons jlist. jsons ::= json. { printf("END\n"); } /*jsons ::= error. { printf("starting over after error\n"); } */ json ::= value. { printf("JSON\n"); } object ::= lbrace rbrace. { printf("OBJECT(empty)\n"); } object ::= lbrace members rbrace. { printf("OBJECT\n"); } lbrace ::= LBRACE. { printf("OBJECT start\n"); } rbrace ::= RBRACE. //{ printf("OBJECT close\n"); } members ::= pair. // { printf("members\n"); } members ::= pair COMMA members. // { printf("members comma\n"); } pair ::= STRING(A) COLON value. { printf("pairkey(\"%s\")\n", A.str); } //array ::= error. lbracket ::= LBRACKET. { printf("ARRAY start\n"); } rbracket ::= RBRACKET. //{ printf("ARRAY close\n"); } //array ::= lbracket error rbracket. { printf("ARRAY(error)\n"); } array ::= lbracket rbracket. { printf("ARRAY(empty)\n"); } array ::= lbracket elements rbracket. { printf("ARRAY\n"); } elements ::= value. // { printf("elements\n"); } elements ::= value COMMA elements. // { printf("elements comma\n"); } value ::= literal. value ::= object. value ::= array. literal(A) ::= STRING(B). { printf("LITERAL STRING(\"%s\")\n", B.str); A = B; } literal ::= NUMBER(A). { printf("LITERAL NUMBER(\"%s\" = %f)\n", A.str, atof(A.str)); } literal ::= LITTRUE. { printf("LITERAL true\n"); } literal ::= LITFALSE. { printf("LITERAL false\n"); } literal ::= LITNULL. { printf("LITERAL null\n"); }