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