skelrc: Add a debugging utility.
[skel] / skelrc.y
1 ;;; -*-emacs-lisp-*-
2
3 (skelrc-force-mode 'c-mode)
4
5 (setq skel-alist
6 (append
7 `((new-comment . "/*")
8 (cont-comment . " *")
9 (end-comment . " */")
10 (block-start . "/*")
11 (block-banner-knob . "* ")
12 (block-banner-end . "*/")
13 (block-end . "\n */")
14 (preamble . "[[c-stuff]][[yacc-stuff]][[c-code]]")
15
16 ;; --- Heavy-duty C preamble to the parser ---
17
18 (c-stuff . "[[includes]][[macros]][[depends]][[references]]")
19 (includes . "[[includes-banner]]\n%{\n\n[[headers]]")
20 (includes-banner . (skelrc-banner "Header files"))
21 (headers . "")
22 (macros . "[[macros-banner]]\n\n[[macros-body]]")
23 (macros-banner . (skelrc-banner "Parser control macros"))
24 (macros-body . "#define YYDEBUG 1\n#define YYERROR_VERBOSE\n\n")
25 (depends . "[[deps-banner]]\n\n[[deps-body]]")
26 (deps-banner . (skelrc-banner "External dependencies"))
27 (deps-body . "extern int yylex(void);\n\n")
28 (references . "[[refs-banner]]\n\n[[refs-body]]")
29 (refs-banner . (skelrc-banner "Forward references"))
30 (refs-body . "static int yyerror(const char */*e*/);\n\n")
31
32 ;; --- Yacc preamble and main parser ---
33
34 (yacc-stuff . "[[yacc-decls]][[tokens]][[nonterms]][[yacc-parser]]")
35
36 (yacc-decls . "[[decls-banner]]%}\n\n[[decls-body]]")
37 (decls-banner . (skelrc-banner "Yacc declarations"))
38 (decls-body . ,(concat "%expect 0\n"
39 "%start ...\n"
40 "\n"
41 "/* --- Stack type --- */\n"
42 "\n"
43 "%union {\n"
44 "}\n"
45 "\n"))
46 (tokens . "[[toks-banner]]\n\n")
47 (toks-banner . (skelrc-banner "Token declarations"))
48 (nonterms . "[[nonterms-banner]]\n\n")
49 (nonterms-banner . (skelrc-banner "Nonterminal declarations"))
50
51 (yacc-parser . "[[parser-banner]]\n%%\n\n")
52 (parser-banner . (skelrc-banner "Grammar rules"))
53
54 ;; --- C code stuck on the end ---
55
56 (c-code . "[[c-code-banner]]\n%%\n\n[[yyerror]]")
57 (c-code-banner . (skelrc-banner "C code"))
58 (yyerror . ,(concat "/* --- @yyerror@ --- *\n"
59 " *\n"
60 " * Arguments:\t@const char *e@ = "
61 "error message text\n"
62 " *\n"
63 " * Returns:\t---\n"
64 " *\n"
65 " * Use:\t\tHandles errors reported by "
66 "the parser.\n"
67 " */\n"
68 "\n"
69 "static void yyerror(const char *e)\n"
70 "{\n"
71 " fprintf(stderr, \"%s\\n\", e);\n"
72 "}\n"
73 "\n")))
74 skel-alist))