| /* Make this with: lex delatex.lex; cc lex.yy.c -ll -o delatex */ |
| L [A-Za-z] |
| %Start Display Math Normal Tag VerbPlus Bracket |
| %% |
| <Normal>\' {yyleng--; yymore(); /* ignore apostrophes */} |
| <Normal>{L}+\\- {yyleng-=2; yymore(); /* ignore hyphens */} |
| <Normal>[a-zA-Z0-9_]+@[a-zA-Z0-9_.]+ ; /* ignore email addresses */ |
| <Normal>[a-z]/[^A-Za-z] ; /* ignore single letter "words" */ |
| <Normal>[A-Z]+ ; /* ignore words all in uppercase */ |
| <Normal>{L}+('{L}*)*{L} {printf("%s\n",yytext); /* any other letter seq is a word */} |
| <Normal>"%".* ; /* ignore comments */ |
| <Normal>\\{L}+ ; /* ignore other control sequences */ |
| <Normal>"\\begin{" BEGIN Tag; /* ignore this and up to next "}" */ |
| <Normal>"\\bibitem{" BEGIN Tag; |
| <Normal>"\\bibliography{" BEGIN Tag; |
| <Normal>"\\bibstyle{" BEGIN Tag; |
| <Normal>"\\cite{" BEGIN Tag; |
| <Normal>"\\end{" BEGIN Tag; |
| <Normal>"\\include{" BEGIN Tag; |
| <Normal>"\\includeonly{" BEGIN Tag; |
| <Normal>"\\input{" BEGIN Tag; |
| <Normal>"\\label{" BEGIN Tag; |
| <Normal>"\\pageref{" BEGIN Tag; |
| <Normal>"\\ref{" BEGIN Tag; |
| <Normal>"\\verb+" BEGIN VerbPlus; |
| <Normal>"\\documentclass[" BEGIN Bracket; |
| <Normal>"\\documentclass{" BEGIN Tag; |
| <Normal>"\\usepackage[" BEGIN Bracket; |
| <Normal>"\\usepackage{" BEGIN Tag; |
| <Bracket>[^\]] ; |
| <Bracket>"][" ; |
| <Bracket>"]{" BEGIN Tag; |
| <Bracket>"]" BEGIN Normal; |
| <Tag>[^}] ; /* ignore things up to next "}" */ |
| <Tag>"}" BEGIN Normal; |
| <VerbPlus>[^+] ; /* ignore thing up to next "+" */ |
| <VerbPlus>"+" BEGIN Normal; |
| <Normal>[0-9]+ ; /* ignore numbers */ |
| <Normal>"\\(" BEGIN Math; /* begin latex math mode */ |
| <Math>"\\)" BEGIN Normal; /* end latex math mode */ |
| <Math>.|\\[^)]|\n ; /* ignore anything else in latex math mode */ |
| <Normal>"\\[" BEGIN Display; /* now in Latex display mode */ |
| <Display>[^$]|\\[^\]] ; /* ignore most things in display math mode */ |
| <Display>"\\]" BEGIN Normal; /* get out of Display math mode */ |
| <Normal>\\. ; /* ignore other single character control sequences */ |
| <Normal>\\\n ; /* more of the same */ |
| <Normal>\n|. ; /* ignore anything else, a character at a time */ |
| %% |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| int |
| main(int argc, char **argv) |
| { |
| int i; |
| |
| if (argc==1) { |
| yyin = stdin; |
| BEGIN Normal; /* Starts yylex off in the right state */ |
| yylex(); |
| } |
| else for (i=1; i<argc; i++) { |
| yyin = fopen(argv[i],"r"); |
| if (yyin==NULL) { |
| fprintf(stderr,"can't open %s\n",argv[i]); |
| exit(1); |
| } |
| BEGIN Normal; /* Starts yylex off in the right state */ |
| yylex(); |
| } |
| exit(0); |
| } |
| int |
| yywrap(void) |
| { |
| return 1; |
| } |