/* Yacc / Bison hl test file. * It won't compile :-) Sure ! */ %{ #include <iostream> using namespace std; extern KateParser *parser; %} %locations %union { int int_val; double double_val; bool bool_val; char *string_val; char *ident_val; struct var *v; void *ptr; } %token <int_val> TOK_NOT_EQUAL "!=" %token <int_val> TOK_LESSER_E "<=" %token <int_val> TOK_GREATER_E ">=" %token <int_val> TOK_EQUAL_2 "==" //comment %token PERCENT_DEBUG "%debug" PERCENT_DEFAULT_PREC "%default-prec" PERCENT_DEFINE "%define" ; %type <int_val> type type_proc %code top { #define _GNU_SOURCE #include <stdio.h> int val; } %destructor { free ($$); printf ("%d", @$.first_line); } <*> %lex-param {scanner_mode *mode}; %parse-param {int *nastiness} {int *randomness} %initial-action { @$.initialize (file_name); }; %% prog: KW_PROGRAM ident { parser->start($2); } prog_beg_glob_decl instructions { parser->endproc(0); } dev_procedures KW_ENDP ; number: integer_number | TOK_DOUBLE { $$ = new var; $$->type = KW_REEL; $$->cl = var::LITTERAL; $$->real = $<int_val>1; }; words: %empty | words word ; %type <type> word; %printer { fprintf (yyo, "%s", word_string ($$)); } <type>; word: %?{ boom(1); } | "hello" { $$ = hello; } | "bye" { $$ = bye; } ; foo: { $$ = 0 } | number { $$ = $1 | $2; } | hello { $$ = $1 | $3; } // without a comma hello: gram1 { $$ = "hi" }; | gram2 ;; %% #include <stdio.h> int main(void) { puts("Hello, World!"); return 0; } // ALERT NOTE