%{ #include #include #include int yylex(); int yyerror(const char* error); #define YYDEBUG 1 char* concatenate(char* first, char* second) { int firstlen = strlen(first); int secondlen = strlen(second); char* result; result = malloc(firstlen + secondlen + 1); strcpy(result, first); strcat(result, second); return result; } void printStyles() { puts( " " ); } void printCollapsableScript() { puts( "" ); } char* stylize(char* text, char* style) { char* result = concatenate(""); result = concatenate(result, text); result = concatenate(result, ""); return result; } char* collapsableBlock(char* text) { char* result = concatenate("", "
"); result = concatenate(result, text); result = concatenate(result, "
"); return result; } void printNumber(char* text) { char* style = stylize(text, "number"); printf("%s", style); } void printIdentifier(char* text) { char* style = stylize(text, "identifier"); printf("%s", style); } void printKeyword(char* text) { char* style = stylize(text, "keyword"); printf("%s", style); } void printString(char* text) { char* style = stylize(text, "string"); printf("%s", style); } void printOperator(char* text) { char* style = stylize(text, "operator"); printf("%s", style); } void printMisc(char* text) { printf("%s", text); } void printUnrecognized(char* text) { printf("Unrecognized token: %s", text); } void printBraces(char* text) { printf("%s", text); } %} %start input %token NUMBER %token KEYWORD %token STRING %token STRING_DQ %token IDENTIFIER %token OPERATOR %token MISC %token UNRECOGNIZED %token LCURLY %token RCURLY %union { char* strval; } %type input expr_list expr token_sequence token NUMBER KEYWORD STRING STRING_DQ IDENTIFIER OPERATOR MISC UNRECOGNIZED LCURLY RCURLY %% input: /* empty */ { printf("empty\n"); } | expr_list { printf("%s", $$); } ; expr_list: expr expr_list { $$ = concatenate($1, $2); } | expr { $$ = $1; } ; expr: token_sequence | LCURLY expr_list RCURLY { char* collapsable = collapsableBlock($2); $$ = concatenate("{", collapsable); $$ = concatenate($$, "}"); } | LCURLY RCURLY { $$ = concatenate("{", "}"); } ; token_sequence: token_sequence token { $$ = concatenate($1, $2); } | token { $$ = $1; } ; token: NUMBER { $$ = stylize($1, "number"); } | KEYWORD { $$ = stylize($1, "keyword"); } | STRING { $$ = stylize($1, "string"); } | STRING_DQ { $$ = stylize($1, "string"); } | IDENTIFIER { $$ = stylize($1, "identifier"); } | OPERATOR { $$ = stylize($1, "operator"); } | MISC { $$ = $1; } | UNRECOGNIZED { $$ = $1 } ; %% int yyerror(const char* error) { extern int current_line; fprintf(stderr, "input:%d: error: %s\n", current_line, error); return 0; } void printHtmlHeader() { puts( "" " hello_world.go" ); printStyles(); puts( "" ); } void printBody() { puts( "" "
"
      );
      yyparse();
      puts("
"); } void printHTML() { puts( "" "" ); printHtmlHeader(); printBody(); printCollapsableScript(); puts(""); } int main(int argc, const char* argv[]) { printHTML(); return 0; }