summaryrefslogtreecommitdiff
path: root/graphics/tree/tpar.l
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/tree/tpar.l
Initial commit
Diffstat (limited to 'graphics/tree/tpar.l')
-rw-r--r--graphics/tree/tpar.l206
1 files changed, 206 insertions, 0 deletions
diff --git a/graphics/tree/tpar.l b/graphics/tree/tpar.l
new file mode 100644
index 0000000000..a601fd888b
--- /dev/null
+++ b/graphics/tree/tpar.l
@@ -0,0 +1,206 @@
+%{
+/*
+ * tpar: pre-processor for tree; adds parens according to indentation.
+ * Version 0.1
+ *
+ * Blank line ends the tree.
+ * ` - ' adds following item on same line as single child.
+ * Does not do forests -- add outer parens in source as part of
+ * beginning and ending node names or use null command \Z.
+ * Option -t converts N',V',A',P' by adding TeX \overline commands,
+ * and [<digit or i,j,k,x,y,z>] by adding TeX subscripting
+ * commands.
+ * Option -v puts right parentheses on new lines, with indentation
+ * the same as the preceding matching paren.
+ *
+ * Greg, lee@uhccux.uhcc.hawaii.edu, 6/24/90
+ */
+
+#define TRUE 1
+#define FALSE 0
+int tex_opt = FALSE;
+int v_opt = FALSE;
+
+int outercol = 0;
+int linenumber = 0;
+int indent = 0;
+int minindent = 0;
+int level = 0;
+int buried[100];
+int extra = 0;
+%}
+
+%s T O X
+
+%%
+
+<O>\n {
+ outercol = 0;
+ indent = 0;
+ linenumber++;
+ ECHO;
+}
+
+<T,X>\n {
+ if (!outercol) {
+ descend(minindent);
+ ECHO;
+ BEGIN(O);
+ }
+ indent = outercol = 0;
+ linenumber++;
+}
+
+<O>\t {
+ outercol++;
+ while (outercol % 8) outercol++;
+ ECHO;
+}
+
+<T,X>\t {
+ outercol++;
+ while (outercol % 8) outercol++;
+}
+
+<T,X>" " {
+ outercol++;
+ if (indent) ECHO;
+}
+
+<T,X>[ \t]+"-"[ \t]+ {
+ extra++;
+ printf("(");
+}
+
+\\tree[ \t]*(-([tuvLTOIFER]+|[bg][0-9]+)[ \t]*)* {
+ outercol += yyleng;
+ level = extra = 0;
+ minindent = 200;
+ buried[0] = -1;
+ if (tex_opt) BEGIN(X);
+ else BEGIN(T);
+ ECHO;
+}
+
+<O>. {
+ outercol++;
+ ECHO;
+}
+
+<X>[NVAP]' {
+ ascend();
+ outercol += 2;
+ printf("$\\overline{\\rm %c}$", yytext[0]);
+}
+
+<X>\[[0-9ijkxyz]\] {
+ ascend();
+ outercol += 3;
+ printf("$_%c$", yytext[1]);
+}
+
+<T,X>\\Z[ \t]*$ {
+ ascend();
+ outercol += 2;
+}
+
+<T,X>. {
+ ascend();
+ outercol++;
+ ECHO;
+}
+
+%%
+
+descend(indent)
+int indent;
+{ int i;
+
+ if (extra) do printf(")"); while (--extra);
+ if (indent > buried[level]) {
+ buried[++level] = indent;
+ }
+ else {
+ printf(")");
+ while (level >= 0 && indent < buried[level]) {
+ level--;
+ if (v_opt) {
+ printf("\n");
+ for (i = 1; i < buried[level]; i++)
+ printf(" ");
+ }
+ printf(")");
+ }
+ }
+ printf("\n");
+}
+
+ascend()
+{ int i;
+
+ if (indent) return;
+ descend(indent = outercol+1);
+ if (indent < minindent) minindent = indent;
+ for (i = 1; i < indent; i++) printf(" ");
+ printf("(");
+}
+
+extern char *optarg; /* from getopt */
+extern int optind;
+
+main(argc, argv)
+int argc;
+char *argv[];
+{ int c;
+ char *progname = NULL, *basename();
+
+ progname = basename (argv[0]);
+ while ((c = getopt (argc, argv, "htv")) != EOF)
+ switch (c) {
+ case 't': tex_opt = TRUE; break;
+ case 'v': v_opt = TRUE; break;
+ case 'h':
+ default:
+ fprintf(stderr, "Usage: %s [options] [files]\n", progname);
+ fprintf(stderr, "options = -t\t(TeX code)\n");
+ fprintf(stderr, " -v\t(parens on new lines)\n");
+ fprintf(stderr, " -h\t(print this information)\n");
+ exit(1);
+ }
+
+ BEGIN(O);
+
+ if (optind >= argc) {
+ (void) yylex ();
+ }
+ else for (; (optind < argc); optind++) {
+ if (yyin == NULL) yyin = stdin;
+ if (freopen (argv[optind], "r", stdin) != NULL) {
+#ifdef FLEX_SCANNER
+ /* to get flex to look at > 1 file */
+ yy_init = 1;
+#endif
+ (void) yylex ();
+ if (level > 1) descend(minindent);
+ outercol = linenumber = indent = minindent = 0;
+ level = extra = 0;
+ }
+ else {
+ (void) fprintf (stderr,
+ "Couldn't open file: %s\n", argv[optind]);
+ exit (1);
+ }
+ }
+ if (level > 1) descend(minindent);
+}
+
+
+char *basename (s)
+char *s;
+{
+ char *p, *strrchr();
+
+ if (p = strrchr(s, '/'))
+ return(++p);
+ else return(s);
+}