1 %{
  2 #include <stdio.h>
  3
  4 #define YYDEBUG 1
  5
  6 extern char *yytext;
  7 extern int yylex();
  8 extern int yychar;
  9 extern int LineNo;
 10
 11 void yyerror(char *s);
 12
 13 %}
 14
 15 %token DOC_START DOC_END HEAD_START HEAD_END BODY_START BODY_END
 16 %token BF_START BF_END IT_START IT_END
 17 %token UL_START UL_END OL_START OL_END LI_START LI_END
 18 %token SPACE TEXT TAG
 19
 20 %start Doc
 21 %%
 22
 23 Doc : WSpace DOC_START WSpace Head WSpace Body WSpace DOC_END WSpace
 24     ;
 25
 26 Head : HEAD_START Html HEAD_END
 27      /*| error Html HEAD_END { yyerrok; fprintf(stderr,"Head error recovery\n"); }*/ 
 28      /*| HEAD_START Html error { fprintf(stderr,"Missing </html> tag!\n");}*/
 29      ;
 30
 31 Body : BODY_START Html BODY_END
 32      /*| BODY_START Html error  { fprintf(stderr, "Missing <\\body> tag!\n"); }*/
 33 ;
 34
 35 WSpace : SPACE { printf("%s", yytext); }
 36      | /* epsilon */
 37 ;
 38
 39 Html : Html item
 40 /*     | error item { yyerrok; fprintf(stderr,"Html error recovery\n"); }*/
 41      | /* epsilon */
 42 ;
 43
 44 item : Boldface
 45      | Italics
 46      | List
 47      | TEXT { printf("%c", *yytext); }
 48      | TAG
 49      | SPACE { printf("%s", yytext); }
 50 ;
 51
 52 Boldface : BF_START Html BF_END
 53          | error Html BF_END { yyerrok; fprintf(stderr, "Missing open bold tag\n");}
 54 ;
 55
 56 Italics : IT_START Html IT_END
 57         | error Html IT_END { yyerrok; fprintf(stderr, "Missing open italics tag\n");}
 58 ;
 59
 60 List : UL_START WSpace ItemList WSpace UL_END
 61      | OL_START WSpace ItemList WSpace OL_END
 62      | error OL_END { yyerrok; fprintf(stderr, "Missing open ordered list tag\n");}
 63      | error UL_END { yyerrok; fprintf(stderr, "Missing open unordered tag\n");}
 64 ;
 65
 66 ItemList: ItemList WSpace OneItem
 67         | OneItem /* epsilon */
 68 ;
 69
 70 OneItem : LI_START Html LI_END
 71         | error Html LI_END { yyerrok; fprintf(stderr, "Missing open list item tag\n");}
 72 ;
 73
 74 %%
 75 +-- 48 lines: void yyerror(char *s)
123