mirror of https://github.com/CGAL/cgal
1363 lines
42 KiB
Plaintext
1363 lines
42 KiB
Plaintext
/**************************************************************************
|
|
|
|
html_lex.yy
|
|
=============================================================
|
|
Project : Tools for the CC manual writing task around cc_manual.sty.
|
|
Function : lexical scanner for TeX and C++ code mixed files.
|
|
Taylored for HTML manual generation.
|
|
System : flex, bison, C++ (g++)
|
|
Author : (c) 1996 Lutz Kettner
|
|
Revision : $Revision$
|
|
Date : $Date$
|
|
|
|
**************************************************************************/
|
|
|
|
%{
|
|
extern "C" int yylex( void );
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <stream.h>
|
|
#include <string.h>
|
|
#include <database.h>
|
|
#include <html_config.h>
|
|
#include <html_syntax.tab.h>
|
|
|
|
// This flag is true if an \mbox encounters in a math environment.
|
|
bool mbox_within_math = false;
|
|
|
|
// This flag is true for the first macro in a newcommand. It should not
|
|
// get replaced by previous definitions.
|
|
bool actual_defining = false;
|
|
|
|
// This flag indicates whether we are in a tabbing or tabular environment.
|
|
bool tab_tag = false;
|
|
|
|
// This flag is true if we are inside a definition. here, \input and
|
|
// \include should not open a file.
|
|
bool ignore_input_tag = false;
|
|
|
|
/* Set this flag to 1 to switch immediately to CCMode. */
|
|
int set_CCMode = 0;
|
|
/* Set this flag to 1 to switch immediately to NestingMode. */
|
|
int set_NestingMode = 0;
|
|
/* Set this flag to 1 to switch back to INITIAL. */
|
|
int set_INITIAL = 0;
|
|
int set_HTMLMODE = 0;
|
|
int set_MMODE = 0;
|
|
|
|
/* Tag to mark whenever the unchecked keyword occurs. */
|
|
int unchecked_tag = 0;
|
|
|
|
/* Count the linenumber for better errormessages. */
|
|
int line_number = 1;
|
|
|
|
/* store the creationvariable */
|
|
char* creationvariable = NULL;
|
|
char* formatted_creationvariable = NULL;
|
|
extern char* class_name;
|
|
extern char* template_class_name;
|
|
extern char* formatted_class_name;
|
|
extern char* formatted_template_class_name;
|
|
|
|
/* match math mode delimiters */
|
|
bool math_mode_toggle = false;
|
|
|
|
/* remember the necessary stop character for \verb"..." */
|
|
char stop_character;
|
|
|
|
/* prototypes */
|
|
bool is_html_multi_character( char c);
|
|
const char* html_multi_character( char c);
|
|
char* addSuffix( const char* name, const char* suffix);
|
|
|
|
/* Enable line number printing to cerr. */
|
|
extern char line_switch;
|
|
|
|
/* Enable warnings for undefined macros. */
|
|
extern char warn_switch;
|
|
|
|
/* Hack, to get rid of the yywrap. */
|
|
#define YY_SKIP_YYWRAP 1
|
|
#define yywrap() 1
|
|
|
|
void skipspaces( void);
|
|
void skipoptionalparam( void);
|
|
|
|
/* Include file handling */
|
|
FILE* current_in_stream;
|
|
extern const char* in_filename;
|
|
#define MAX_INCLUDE_DEPTH 32
|
|
YY_BUFFER_STATE buffer_stack[ MAX_INCLUDE_DEPTH];
|
|
const char* file_name_stack[ MAX_INCLUDE_DEPTH];
|
|
FILE* in_stream_stack[ MAX_INCLUDE_DEPTH];
|
|
int line_number_stack[ MAX_INCLUDE_DEPTH];
|
|
int stack_ptr = 0;
|
|
|
|
|
|
#define SET( s) ((yylval.string.text = (s)), ( yylval.string.len = -1))
|
|
%}
|
|
|
|
/* The normal scanning mode parses TeX conventions. */
|
|
/* In CCMode, it parses C++ conventions. */
|
|
/* The NestingMode parses only (){}[] nested expressions */
|
|
/* The VerbMode parses LaTeX \verb"..." statements as */
|
|
/* a sequence of characters */
|
|
%x CCMode
|
|
%x NestingMode
|
|
%x VerbMode
|
|
%x CPROGMode
|
|
%x ITEMMODE
|
|
%x INCLUDEMODE
|
|
%x TEXONLYMODE
|
|
%x HTMLMODE
|
|
%x HTMLGROUPMode
|
|
%x MMODE
|
|
|
|
letter [a-zA-Z]
|
|
noletter [^a-zA-Z]
|
|
digit [0-9]
|
|
CCletter [a-zA-Z_]
|
|
idfier {letter}+
|
|
texmacro [\\]{idfier}
|
|
CCidfier ({CCletter}({CCletter}|{digit})*)
|
|
filename [^ \t\n/\\\{\}\[\]()]+
|
|
space [\t ]
|
|
w {space}*
|
|
ws {space}+
|
|
escchar [\\]
|
|
sign [+-]
|
|
exp [eE]
|
|
number {digit}+
|
|
signNumber ({sign}?{number})
|
|
floatNumber ({signNumber}\.|{signNumber}\.{number})
|
|
expNumber ({floatNumber}|{signNumber}){exp}{signNumber}
|
|
No ({signNumber}|{floatNumber}|{expNumber})
|
|
operator [^a-zA-Z_0-9\n\r\t \\]
|
|
measure {signNumber}{letter}{letter}
|
|
ttblockintro [\{][\\](tt)
|
|
emblockintro [\{][\\](em)
|
|
itblockintro [\{][\\]((it)|(sl))
|
|
scblockintro [\{][\\](sc)
|
|
bfblockintro [\{][\\](bf)
|
|
|
|
%%
|
|
/* Mode switching can be triggered from the parser */
|
|
/* ----------------------------------------------- */
|
|
if (set_CCMode) {
|
|
BEGIN( CCMode);
|
|
set_CCMode = 0;
|
|
}
|
|
if (set_NestingMode) {
|
|
BEGIN( NestingMode);
|
|
set_NestingMode = 0;
|
|
}
|
|
if (set_INITIAL) {
|
|
BEGIN( INITIAL);
|
|
set_INITIAL = 0;
|
|
}
|
|
if (set_HTMLMODE) {
|
|
BEGIN( HTMLMODE);
|
|
set_HTMLMODE = 0;
|
|
}
|
|
if (set_MMODE) {
|
|
BEGIN( MMODE);
|
|
set_MMODE = 0;
|
|
}
|
|
|
|
/* Count line numbers in all modes for better error messages */
|
|
/* --------------------------------------------------------- */
|
|
<INITIAL,CCMode,NestingMode,CPROGMode,MMODE,ITEMMODE,TEXONLYMODE,HTMLMODE,HTMLGROUPMode>[\n] {
|
|
line_number++;
|
|
if ( line_switch)
|
|
cerr << "src-line " << line_number << endl;
|
|
return NEWLINE;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]"\n" {
|
|
line_number++;
|
|
if ( line_switch)
|
|
cerr << "src-line " << line_number << endl;
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 1;
|
|
return SPACE;
|
|
}
|
|
|
|
/* Handle include files */
|
|
/* ------------------------- */
|
|
|
|
[\\]((include)|(input))[\{]{w} {
|
|
if (ignore_input_tag) {
|
|
int c = yyinput();
|
|
while( c && c != '}')
|
|
c = yyinput();
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 0;
|
|
return SPACE;
|
|
}
|
|
BEGIN ( INCLUDEMODE);
|
|
}
|
|
<INCLUDEMODE>{filename} {
|
|
/* remove trailing characters from the input/include statement */
|
|
int c = yyinput();
|
|
while( c && c != '}')
|
|
c = yyinput();
|
|
if ( stack_ptr >= MAX_INCLUDE_DEPTH)
|
|
printErrorMessage( IncludeNestingTooDeepError);
|
|
else {
|
|
buffer_stack[ stack_ptr] = YY_CURRENT_BUFFER;
|
|
file_name_stack[ stack_ptr] = in_filename;
|
|
in_stream_stack[ stack_ptr] = current_in_stream;
|
|
line_number_stack[ stack_ptr] = line_number;
|
|
++stack_ptr;
|
|
/* check whether any suffix is already there or not */
|
|
int i = 0;
|
|
while ( i < yyleng && yytext[i] != '.')
|
|
++i;
|
|
char* tmp_name;
|
|
if ( i < yyleng)
|
|
/* this is done to get a 'delete'able copy */
|
|
tmp_name = addSuffix( yytext, "");
|
|
else
|
|
tmp_name = addSuffix( yytext, ".tex");
|
|
current_in_stream = fopen( tmp_name, "r");
|
|
if ( ! current_in_stream) {
|
|
int j;
|
|
printErrorMessage( IncludeOpenError);
|
|
delete[] tmp_name;
|
|
--stack_ptr;
|
|
for ( j = stack_ptr; j >= 0; j--) {
|
|
cerr << "file include from `" << file_name_stack[ j]
|
|
<< "'" << endl;
|
|
}
|
|
} else {
|
|
yyin = current_in_stream;
|
|
in_filename = tmp_name;
|
|
yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE));
|
|
line_number = 1;
|
|
}
|
|
}
|
|
BEGIN( INITIAL);
|
|
}
|
|
<<EOF>> {
|
|
if ( stack_ptr <= 0) {
|
|
yyterminate();
|
|
} else {
|
|
-- stack_ptr;
|
|
delete[] (char*)in_filename;
|
|
line_number = line_number_stack[ stack_ptr];
|
|
in_filename = file_name_stack[ stack_ptr];
|
|
current_in_stream = in_stream_stack[ stack_ptr];
|
|
yy_switch_to_buffer( buffer_stack[ stack_ptr]);
|
|
}
|
|
}
|
|
|
|
|
|
/* Rules for TeX conventions */
|
|
/* ------------------------- */
|
|
<INITIAL,MMODE>[\\]"%" { /* Avoid the quoted comment symbol */
|
|
yylval.character = '%';
|
|
return CHAR;
|
|
}
|
|
<INITIAL,MMODE>"%".*[\n]{w} { /* Match one line TeX comments */
|
|
/* remove spaces in next line */
|
|
unput( '\n');
|
|
}
|
|
<INITIAL,MMODE>"%".* { /* Match one line TeX comments */
|
|
/* at the last line in file */
|
|
}
|
|
[\\]verb{noletter} { /* match LaTeX \verb"..." constructs */
|
|
BEGIN( VerbMode);
|
|
stop_character = yytext[ yyleng-1];
|
|
yylval.string.text = "<PRE>";
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
<VerbMode>{ws} {
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = yyleng;
|
|
return SPACE;
|
|
}
|
|
<VerbMode>. {
|
|
if ( yytext[0] == stop_character) {
|
|
BEGIN( INITIAL);
|
|
yylval.string.text = "</PRE>";
|
|
yylval.string.len = 6;
|
|
return STRING;
|
|
}
|
|
if ( yytext[0] == '\n') {
|
|
line_number++;
|
|
if ( line_switch)
|
|
cerr << "src-line " << line_number << endl;
|
|
}
|
|
yylval.character = yytext[0];
|
|
return CHAR;
|
|
}
|
|
|
|
/* Chapter and labels triggering new file and linking */
|
|
/* -------------------------------------------------- */
|
|
[\\]chapter{w}[\{] {
|
|
skipspaces();
|
|
return CHAPTER;
|
|
}
|
|
[\\]section[*]?{w}[\{] {
|
|
return SECTION;
|
|
}
|
|
[\\]subsection[*]?{w}[\{] {
|
|
return SUBSECTION;
|
|
}
|
|
[\\]subsubsection[*]?{w}[\{] {
|
|
return SUBSUBSECTION;
|
|
}
|
|
[\\]label{w}[\{][^\}]+/[\}] {
|
|
yyinput();
|
|
char* s = yytext;
|
|
while( *s != '{')
|
|
++s;
|
|
++s;
|
|
while( *s && *s <= ' ')
|
|
++s;
|
|
yylval.string.text = s;
|
|
yylval.string.len = -1;
|
|
return LABEL;
|
|
}
|
|
|
|
|
|
/* Different keywords from the manual style triggering C++ formatting */
|
|
/* ------------------------------------------------------------------ */
|
|
[\\]begin{w}[\{]ccClass[\}]{w} {
|
|
BEGIN( CCMode);
|
|
return BEGINCLASS;
|
|
}
|
|
[\\]end{w}[\{]ccClass[\}] {
|
|
return ENDCLASS;
|
|
}
|
|
[\\]begin{w}[\{]ccClassTemplate[\}]{w} {
|
|
BEGIN( CCMode);
|
|
return BEGINCLASSTEMPLATE;
|
|
}
|
|
[\\]end{w}[\{]ccClassTemplate[\}] {
|
|
return ENDCLASSTEMPLATE;
|
|
}
|
|
[\\]ccCreationVariable{w}[\{]{w}[^\}]*{w}[\}] {
|
|
char *s = yytext + yyleng - 2;
|
|
while (( *s == ' ') || ( *s == '\t'))
|
|
s--;
|
|
char *r = yytext;
|
|
while ( *r != '{')
|
|
r++;
|
|
r++;
|
|
while (( *r == ' ') || ( *r == '\t'))
|
|
r++;
|
|
s[1] = 0;
|
|
if ( creationvariable)
|
|
delete[] creationvariable;
|
|
if ( formatted_creationvariable)
|
|
delete[] formatted_creationvariable;
|
|
creationvariable = newstr( r);
|
|
formatted_creationvariable = new char[ strlen(
|
|
creationvariable) + 12];
|
|
strcpy( formatted_creationvariable, "<VAR>");
|
|
strcat( formatted_creationvariable, creationvariable);
|
|
strcat( formatted_creationvariable, "</VAR>");
|
|
yylval.string.text = r;
|
|
yylval.string.len = s - r + 1;
|
|
return CREATIONVARIABLE;
|
|
}
|
|
[\\]ccConstructor/{noletter} { /* constructor declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return CONSTRUCTOR;
|
|
}
|
|
[\\]ccMemberFunction/{noletter} { /* method declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return METHOD;
|
|
}
|
|
[\\]ccMethod/{noletter} { /* method declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return METHOD;
|
|
}
|
|
[\\]ccFunction/{noletter} { /* function declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return FUNCTION;
|
|
}
|
|
[\\]ccFunctionTemplate/{noletter} { /* function template declaration:
|
|
change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return FUNCTIONTEMPLATE;
|
|
}
|
|
[\\]ccVariable/{noletter} { /* variable declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return VARIABLE;
|
|
}
|
|
[\\]ccTypedef/{noletter} { /* typedef declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return TYPEDEF;
|
|
}
|
|
[\\]ccNestedType/{noletter} { /* nested type declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return NESTEDTYPE;
|
|
}
|
|
[\\]ccEnum/{noletter} { /* enum declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return ENUM;
|
|
}
|
|
[\\]ccStruct/{noletter} { /* struct declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return STRUCT;
|
|
}
|
|
[\\]ccGlobalFunction/{noletter} { /* function declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return GLOBALFUNCTION;
|
|
}
|
|
[\\]ccGlobalFunctionTemplate/{noletter} { /* function template declaration:
|
|
change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return GLOBALFUNCTIONTEMPLATE;
|
|
}
|
|
[\\]ccGlobalVariable/{noletter} { /* variable declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return GLOBALVARIABLE;
|
|
}
|
|
[\\]ccGlobalTypedef/{noletter} { /* typedef declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return GLOBALTYPEDEF;
|
|
}
|
|
[\\]ccGlobalEnum/{noletter} { /* enum declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return GLOBALENUM;
|
|
}
|
|
[\\]ccGlobalStruct/{noletter} { /* struct declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return GLOBALSTRUCT;
|
|
}
|
|
[\\]ccDeclaration/{noletter} { /* general declaration: change to CCMode */
|
|
skipspaces();
|
|
BEGIN( CCMode);
|
|
return DECLARATION;
|
|
}
|
|
[\\]ccHidden/{noletter} {
|
|
skipspaces();
|
|
return HIDDEN;
|
|
}
|
|
[\\]ccUnchecked/{noletter} {
|
|
/* trigger a global boolean and treat it like a space */
|
|
skipspaces();
|
|
unchecked_tag = 1;
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 10;
|
|
return SPACE;
|
|
}
|
|
|
|
[\\]"begin{verbatim}" |
|
|
[\\]"begin{cprog}" {
|
|
BEGIN( CPROGMode);
|
|
return CPROGBEGIN;
|
|
}
|
|
<CPROGMode>[\\]"end{verbatim}" |
|
|
<CPROGMode>[\\]"end{cprog}" {
|
|
BEGIN( INITIAL);
|
|
return CPROGEND;
|
|
}
|
|
[\\]"cprogfile{"[^\}]*"}" {
|
|
yylval.string.text = yytext + 11;
|
|
yylval.string.len = yyleng - 12;
|
|
return CPROGFILE;
|
|
}
|
|
|
|
[\\]"begin{ccHtmlOnly}" {
|
|
BEGIN( HTMLGROUPMode);
|
|
return HTMLBEGIN;
|
|
}
|
|
<HTMLGROUPMode>[\\]"end{ccHtmlOnly}" {
|
|
BEGIN( INITIAL);
|
|
return HTMLEND;
|
|
}
|
|
|
|
[\\]"begin{ccTexOnly}" {
|
|
BEGIN( TEXONLYMODE);
|
|
return TEXONLYBEGIN;
|
|
}
|
|
<TEXONLYMODE>[\\]"end{ccTexOnly}" {
|
|
BEGIN( INITIAL);
|
|
return TEXONLYEND;
|
|
}
|
|
<TEXONLYMODE>. {
|
|
yylval.character = yytext[0];
|
|
return CHAR;
|
|
}
|
|
[\\]ccTexHtml{w}[\{] {
|
|
return LATEXHTML;
|
|
}
|
|
[\\]ccAnchor{w}[\{] {
|
|
/* The first parameter is the URL, the second is the */
|
|
/* message that will be highlighted */
|
|
BEGIN( HTMLMODE);
|
|
return ANCHOR;
|
|
}
|
|
<HTMLMODE>[\}] {
|
|
BEGIN( INITIAL);
|
|
return '}';
|
|
}
|
|
<HTMLMODE,HTMLGROUPMode>. {
|
|
yylval.character = yytext[0];
|
|
return CHAR;
|
|
}
|
|
|
|
/* Specialized keywords from the manual style */
|
|
/* -------------------------------------------------------------- */
|
|
[\\]cc((Style)|(c))/{noletter} {
|
|
/* CCstyle formatting: change to NestingMode */
|
|
skipspaces();
|
|
BEGIN( NestingMode);
|
|
return CCSTYLE;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ccVar/{noletter} {
|
|
skipspaces();
|
|
if ( creationvariable) {
|
|
yylval.string.text = formatted_creationvariable;
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
} else {
|
|
printErrorMessage( VariableUsedError);
|
|
yylval.string.text = "Unknown creationvariable";
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
}
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ccPureVar/{noletter} {
|
|
skipspaces();
|
|
if ( creationvariable) {
|
|
yylval.string.text = creationvariable;
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
} else {
|
|
printErrorMessage( VariableUsedError);
|
|
yylval.string.text = "Unknown creationvariable";
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
}
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ccClassName/{noletter} {
|
|
skipspaces();
|
|
if ( formatted_class_name) {
|
|
yylval.string.text = formatted_class_name;
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
} else {
|
|
printErrorMessage( ClassnameUsedError);
|
|
yylval.string.text = "Unknown classname";
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
}
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ccPureClassName/{noletter} {
|
|
skipspaces();
|
|
if ( class_name) {
|
|
yylval.string.text = class_name;
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
} else {
|
|
printErrorMessage( ClassnameUsedError);
|
|
yylval.string.text = "Unknown classname";
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
}
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ccClassTemplateName/{noletter} {
|
|
skipspaces();
|
|
if ( formatted_template_class_name) {
|
|
yylval.string.text = formatted_template_class_name;
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
} else {
|
|
printErrorMessage( ClassnameUsedError);
|
|
yylval.string.text = "Unknown template_classname";
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
}
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ccPureClassTemplateName/{noletter} {
|
|
skipspaces();
|
|
if ( template_class_name) {
|
|
yylval.string.text = template_class_name;
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
} else {
|
|
printErrorMessage( ClassnameUsedError);
|
|
yylval.string.text = "Unknown template_classname";
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
}
|
|
return STRING;
|
|
}
|
|
[\\]ccSection/{noletter} {
|
|
skipspaces();
|
|
return CCSECTION;
|
|
}
|
|
[\\]ccSubsection/{noletter} {
|
|
skipspaces();
|
|
return CCSUBSECTION;
|
|
}
|
|
[\\]RCSdef\{{texmacro} {
|
|
yylval.string.text = newstr(yytext + 8);
|
|
yylval.string.len = -1;
|
|
return RCSDEF;
|
|
}
|
|
[\\]RCSdefDate\{{texmacro} {
|
|
yylval.string.text = newstr(yytext + 12);
|
|
yylval.string.len = -1;
|
|
return RCSDEFDATE;
|
|
}
|
|
[\\]CC/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "C++";
|
|
yylval.string.len = 3;
|
|
return STRING;
|
|
}
|
|
[\\]gcc/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "g++";
|
|
yylval.string.len = 3;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]nat/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>N</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]real/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>R</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]N/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>N</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]R/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>R</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]Q/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>Q</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]Z/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>Z</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE>[\\]E/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<B>E</B>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]leda/{noletter} {
|
|
skipspaces();
|
|
/* yylval.string.text = "<TT>LEDA</TT>"; */
|
|
yylval.string.text = "LEDA";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]cgal/{noletter} {
|
|
skipspaces();
|
|
/* yylval.string.text = "<TT>CGAL</TT>"; */
|
|
yylval.string.text = "CGAL";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]protocgal/{noletter} {
|
|
skipspaces();
|
|
/* yylval.string.text = "<TT>C++GAL</TT>"; */
|
|
yylval.string.text = "C++GAL";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]plageo/{noletter} {
|
|
skipspaces();
|
|
/* yylval.string.text = "<TT>PLAGEO</TT>"; */
|
|
yylval.string.text = "PLAGEO";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccDefinition/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Definition</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccInheritsFrom/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Inherits From</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccParameters/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Parameters</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccTypes/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Types</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccConstants/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Constants</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccCreation/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Creation</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccOperations/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Operations</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccAccessFunctions/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Access Functions</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccPredicates/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Predicates</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccModfiers/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Modifiers</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccImplementation/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Implementation</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccExample/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<H3>Example</H3>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]begin[\{]ccAdvanced[\}] {
|
|
skipspaces();
|
|
yylval.string.text = "<br><img border=0 src=\""
|
|
"./cc_advanced_begin.gif\" alt=\"begin of advanced "
|
|
"section\"><br>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]end[\{]ccAdvanced[\}] {
|
|
skipspaces();
|
|
yylval.string.text = "<br><img border=0 src=\""
|
|
"./cc_advanced_end.gif\" alt=\"end of advanced "
|
|
"section\"><br>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccInclude/{noletter} {
|
|
return INCLUDE;
|
|
}
|
|
[\\]ccHeading/{noletter} {
|
|
return HEADING;
|
|
}
|
|
[\\]ccPrecond/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<BR><STRONG>Precondition: </STRONG>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccPostcond/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text ="<BR><STRONG>Postcondition: </STRONG>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]ccCommentHeading/{noletter} {
|
|
return COMMENTHEADING;
|
|
}
|
|
[\\]ccSetTwoOfThreeColumns/{noletter} {
|
|
skipspaces();
|
|
return GOBBLETWOPARAMS;
|
|
}
|
|
[\\]cc((SetThreeColumns)|(Three))/{noletter} {
|
|
skipspaces();
|
|
return GOBBLETHREEPARAMS;
|
|
}
|
|
[\\]ccSetOneOfTwoColumns/{noletter} {
|
|
skipspaces();
|
|
return GOBBLEONEPARAM;
|
|
}
|
|
[\\]cc((SetTwoColumns)|(Two))/{noletter} {
|
|
skipspaces();
|
|
return GOBBLETWOPARAMS;
|
|
}
|
|
[\\]cc((PropagateThreeToTwoColumns)|(ThreeToTwo))/{noletter} {
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 0;
|
|
return SPACE;
|
|
}
|
|
[\\]g?def{w}[\\]{idfier}[^\{]* {
|
|
ignore_input_tag = true;
|
|
BEGIN( NestingMode);
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = yyleng;
|
|
return TEXDEF;
|
|
}
|
|
[\\](re)?newcommand{w}/{noletter} {
|
|
ignore_input_tag = true;
|
|
actual_defining = true;
|
|
BEGIN( NestingMode);
|
|
return NEWCOMMAND;
|
|
}
|
|
[\\]ccTagDefaults{w}/{noletter} {
|
|
tag_defaults();
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 0;
|
|
return SPACE;
|
|
}
|
|
[\\]ccTagFullDeclarations{w}/{noletter} {
|
|
tag_full_declarations();
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 0;
|
|
return SPACE;
|
|
}
|
|
[\\]ccChapterAuthor{w}/{noletter} {
|
|
return CHAPTERAUTHOR;
|
|
}
|
|
[\\]ccChapterSubTitle{w}/{noletter} {
|
|
return CHAPTERSUBTITLE;
|
|
}
|
|
[\\]cc((Glue((Begin)|(End)|(Declarations))?)|(ParDims))/{noletter} {
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 0;
|
|
return SPACE;
|
|
}
|
|
|
|
|
|
|
|
/* Try tabular and tabbing environments */
|
|
/* -------------------------------------------------------------- */
|
|
|
|
<INITIAL,MMODE,NestingMode>[\\]begin[\{]((tabbing)|(eqnarray"*"?))[\}] |
|
|
<INITIAL,MMODE,NestingMode>[\\]begin[\{]((tabular)|(array))[\}][\{][^\}]*[\}] {
|
|
tab_tag = true;
|
|
yylval.string.text =
|
|
"<TABLE><TR><TD ALIGN=LEFT VALIGN=TOP NOWRAP>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]end[\{]((tabbing)|(tabular)|(eqnarray"*"?)|(array))[\}] {
|
|
tab_tag = false;
|
|
yylval.string.text = "</TD></TR></TABLE>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\][=>] {
|
|
yylval.string.text =
|
|
"</TD><TD ALIGN=LEFT VALIGN=TOP NOWRAP>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
|
|
|
|
/* keywords from TeX/LaTeX that have an easy HTML counterpart */
|
|
/* -------------------------------------------------------------- */
|
|
|
|
[\\]begin[\{]itemize[\}] {
|
|
yylval.string.text = "<UL>";
|
|
yylval.string.len = 4;
|
|
return STRING;
|
|
}
|
|
[\\]end[\{]itemize[\}] {
|
|
yylval.string.text = "</UL>";
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
[\\]item[\[] {
|
|
BEGIN( ITEMMODE);
|
|
yylval.string.text = "<DT><B>";
|
|
yylval.string.len = 7;
|
|
return STRING;
|
|
}
|
|
<ITEMMODE>[\]] {
|
|
BEGIN( INITIAL);
|
|
yylval.string.text = "</B><DD>";
|
|
yylval.string.len = 8;
|
|
return STRING;
|
|
}
|
|
<ITEMMODE>[^\]\n]+ {
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = yyleng;
|
|
return STRING;
|
|
}
|
|
[\\]item/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<LI>";
|
|
yylval.string.len = 4;
|
|
return STRING;
|
|
}
|
|
[\\]begin[\{]enumerate[\}] {
|
|
yylval.string.text = "<OL>";
|
|
yylval.string.len = 4;
|
|
return STRING;
|
|
}
|
|
[\\]end[\{]enumerate[\}] {
|
|
yylval.string.text = "</OL>";
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
[\\]begin[\{]description[\}] {
|
|
yylval.string.text = "<DL>";
|
|
yylval.string.len = 4;
|
|
return STRING;
|
|
}
|
|
[\\]end[\{]description[\}] {
|
|
yylval.string.text = "</DL>";
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
[\\]begin[\{]quote[\}] {
|
|
yylval.string.text = "<BLOCKQUOTE>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]end[\{]quote[\}] {
|
|
yylval.string.text = "</BLOCKQUOTE>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
[\\]((pagebreak)|(newpage)|(clearpage)|(cleardoublepage))/{noletter} {
|
|
skipoptionalparam();
|
|
yylval.string.text = "<P>";
|
|
yylval.string.len = 3;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]ldots/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "...";
|
|
yylval.string.len = 3;
|
|
return STRING;
|
|
}
|
|
<MMODE>[\\]le[q]?/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "<="; // ≤ not yet supported
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
<MMODE>[\\]ge[q]?/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = ">="; // ≥ not yet supported
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
<MMODE>[\\]neq/{noletter} {
|
|
skipspaces();
|
|
yylval.string.text = "≠";
|
|
yylval.string.len = 4;
|
|
return STRING;
|
|
}
|
|
[\\]((big)|(med))skip/{noletter} {
|
|
return NEWLINE;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]"&" {
|
|
yylval.string.text = "&";
|
|
yylval.string.len = 5;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\][_^#$~%] {
|
|
yylval.character = yytext[1];
|
|
return CHAR;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[~] |
|
|
<INITIAL,MMODE,NestingMode>[\\]{space} {
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 1;
|
|
return SPACE;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\][\\] {
|
|
skipoptionalparam();
|
|
if ( tab_tag) {
|
|
yylval.string.text =
|
|
"</TD></TR><TR><TD ALIGN=LEFT VALIGN=TOP NOWRAP>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
yylval.string.text = "<BR>";
|
|
yylval.string.len = 4;
|
|
return STRING;
|
|
}
|
|
|
|
/* Mathmode */
|
|
/* -------------------------------------------------------------- */
|
|
[\\][(\[] |
|
|
[$] {
|
|
BEGIN (MMODE);
|
|
return BEGINMATH;
|
|
}
|
|
<MMODE>[\\][)\]] |
|
|
<MMODE>[$] {
|
|
BEGIN (INITIAL);
|
|
return ENDMATH;
|
|
}
|
|
<MMODE>"_"[^\{] {
|
|
yylval.character = yytext[1];
|
|
return SINGLESUBSCRIPT;
|
|
}
|
|
<MMODE>"^"[^\{] {
|
|
yylval.character = yytext[1];
|
|
return SINGLESUPERSCRIPT;
|
|
}
|
|
<MMODE>"_"[\{] {
|
|
return BEGINSUBSCRIPT;
|
|
}
|
|
<MMODE>"^"[\{] {
|
|
return BEGINSUPERSCRIPT;
|
|
}
|
|
<MMODE>\frac/{noletter} {
|
|
return FRACTION;
|
|
}
|
|
<MMODE>[\\][\{\}] {
|
|
yylval.character = yytext[1];
|
|
return CHAR;
|
|
}
|
|
<MMODE>[\{\}] {
|
|
return yytext[0];
|
|
}
|
|
|
|
/* yet not supported characters ...
|
|
<MMODE>[\\]times/{noletter} { SET( "×"); return STRING;}
|
|
<MMODE>[\\]delta/{noletter} { SET( "δ"); return STRING;}
|
|
<MMODE>[\\]epsilon/{noletter} { SET( "ε"); return STRING;}
|
|
<MMODE>[\\]varepsilon/{noletter} { SET( "ε"); return STRING;}
|
|
<MMODE>[\\]lambda/{noletter} { SET( "λ"); return STRING;}
|
|
<MMODE>[\\]pi/{noletter} { SET( "π"); return STRING;}
|
|
<MMODE>[\\]varpi/{noletter} { SET( "ϖ"); return STRING;}
|
|
... */
|
|
|
|
<INITIAL,NestingMode>[\\]["]a { SET( "ä"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]["]o { SET( "ö"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]["]u { SET( "ü"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]["]A { SET( "Ä"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]["]O { SET( "Ö"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]["]U { SET( "Ü"); return STRING;}
|
|
<INITIAL,NestingMode>[\\][']a { SET( "á"); return STRING;}
|
|
<INITIAL,NestingMode>[\\][']e { SET( "é"); return STRING;}
|
|
<INITIAL,NestingMode>[\\][`]a { SET( "à"); return STRING;}
|
|
<INITIAL,NestingMode>[\\][`]e { SET( "è"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]"^"a { SET( "â"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]"^"e { SET( "ê"); return STRING;}
|
|
<INITIAL,NestingMode>[\\]ss[\{][\}] { SET( "ß"); return STRING;}
|
|
<MMODE>[\\]times/{noletter} { SET( "x"); return STRING;}
|
|
<MMODE>[\\]alpha/{noletter} { SET( "α"); return STRING;}
|
|
<MMODE>[\\]beta/{noletter} { SET( "β"); return STRING;}
|
|
<MMODE>[\\]gamma/{noletter} { SET( "γ"); return STRING;}
|
|
<MMODE>[\\]delta/{noletter} { SET( "delta"); return STRING;}
|
|
<MMODE>[\\]epsilon/{noletter} { SET( "eps"); return STRING;}
|
|
<MMODE>[\\]varepsilon/{noletter} { SET( "eps"); return STRING;}
|
|
<MMODE>[\\]zeta/{noletter} { SET( "ζ"); return STRING;}
|
|
<MMODE>[\\]eta/{noletter} { SET( "η"); return STRING;}
|
|
<MMODE>[\\]theta/{noletter} { SET( "θ"); return STRING;}
|
|
<MMODE>[\\]vartheta/{noletter} { SET( "ϑ"); return STRING;}
|
|
<MMODE>[\\]iota/{noletter} { SET( "ι"); return STRING;}
|
|
<MMODE>[\\]kappa/{noletter} { SET( "κ"); return STRING;}
|
|
<MMODE>[\\]lambda/{noletter} { SET( "lambda"); return STRING;}
|
|
<MMODE>[\\]mu/{noletter} { SET( "μ"); return STRING;}
|
|
<MMODE>[\\]nu/{noletter} { SET( "ν"); return STRING;}
|
|
<MMODE>[\\]xi/{noletter} { SET( "ξ"); return STRING;}
|
|
<MMODE>[\\]pi/{noletter} { SET( "pi"); return STRING;}
|
|
<MMODE>[\\]varpi/{noletter} { SET( "pi"); return STRING;}
|
|
<MMODE>[\\]rho/{noletter} { SET( "ρ"); return STRING;}
|
|
<MMODE>[\\]varrho/{noletter} { SET( "ρ"); return STRING;}
|
|
<MMODE>[\\]sigma/{noletter} { SET( "σ"); return STRING;}
|
|
<MMODE>[\\]varsigma/{noletter} { SET( "ς"); return STRING;}
|
|
<MMODE>[\\]tau/{noletter} { SET( "τ"); return STRING;}
|
|
<MMODE>[\\]upsilon/{noletter} { SET( "υ"); return STRING;}
|
|
<MMODE>[\\]phi/{noletter} { SET( "φ"); return STRING;}
|
|
<MMODE>[\\]varphi/{noletter} { SET( "ϕ"); return STRING;}
|
|
<MMODE>[\\]chi/{noletter} { SET( "χ"); return STRING;}
|
|
<MMODE>[\\]psi/{noletter} { SET( "ψ"); return STRING;}
|
|
<MMODE>[\\]omega/{noletter} { SET( "ω"); return STRING;}
|
|
<MMODE>[\\]Gamma/{noletter} { SET( "Γ"); return STRING;}
|
|
<MMODE>[\\]Delta/{noletter} { SET( "Δ"); return STRING;}
|
|
<MMODE>[\\]Theta/{noletter} { SET( "Θ"); return STRING;}
|
|
<MMODE>[\\]Lambda/{noletter} { SET( "Λ"); return STRING;}
|
|
<MMODE>[\\]Xi/{noletter} { SET( "Ξ"); return STRING;}
|
|
<MMODE>[\\]Pi/{noletter} { SET( "Π"); return STRING;}
|
|
<MMODE>[\\]Sigma/{noletter} { SET( "Σ"); return STRING;}
|
|
<MMODE>[\\]Upsilon/{noletter} { SET( "ϒ"); return STRING;}
|
|
<MMODE>[\\]Phi/{noletter} { SET( "Φ"); return STRING;}
|
|
<MMODE>[\\]Psi/{noletter} { SET( "Ψ"); return STRING;}
|
|
<MMODE>[\\]Omega/{noletter} { SET( "Ω"); return STRING;}
|
|
|
|
|
|
/* keywords from TeX/LaTeX that should vanish in HTML */
|
|
/* -------------------------------------------------------------- */
|
|
<INITIAL,MMODE,NestingMode>[\\]((smallskip)|(protect)|(sloppy))/{noletter} {}
|
|
[\\]((maketitle)|(tableofcontents))/{noletter} {}
|
|
[\\]((begin)|(end))[\{]document[\}] {}
|
|
<INITIAL,MMODE,NestingMode>[\\]((tiny)|(scriptsize)|(footnotesize)|(small)|(normalsize)|(large)|(Large))/{noletter} {}
|
|
|
|
|
|
[\\]newsavebox{w}[\{] |
|
|
[\\]usebox{w}[\{] |
|
|
[\\]hspace[*]?{w}[\{] |
|
|
[\\]vspace[*]?{w}[\{] {
|
|
/* CCstyle formatting: change to NestingMode */
|
|
BEGIN( NestingMode);
|
|
return IGNOREBLOCK;
|
|
}
|
|
[\\]((documentclass)|(documentstyle)|(usepackage)|(pagestyle)|(pagenumbering)|(bibliographystyle)|(bibliography)|(title)|(author)|(date)){w}/{noletter} {
|
|
skipoptionalparam();
|
|
yyinput(); /* gobble opening brace */
|
|
BEGIN( NestingMode);
|
|
return IGNOREBLOCK;
|
|
}
|
|
[\\]((textwidth)|(textheight)|(topmargin)|(evensidemargin)|(oddsidemargin)|(headsep)|(parindent)|(parskip)|(beforecprogskip)|(aftercprogskip)){w}(({texmacro})|({measure})) {}
|
|
|
|
[\\]((savebox)|(setlength)|(setcounter)){w}[\{] {
|
|
/* CCstyle formatting: change to NestingMode */
|
|
BEGIN( NestingMode);
|
|
return IGNORETWOBLOCKS;
|
|
}
|
|
[\\]begin[\{]minipage[\}] |
|
|
[\\]end[\{]minipage[\}] {
|
|
skipoptionalparam();
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 1;
|
|
return SPACE;
|
|
}
|
|
|
|
[\\](([vf]box)|(parbox)|([hv]fill)|(nopagebreak)|(nolinebreak)|(linebreak)|(samepage))/{noletter} {
|
|
skipoptionalparam();
|
|
yylval.string.text = " ";
|
|
yylval.string.len = 1;
|
|
return SPACE;
|
|
}
|
|
<INITIAL,NestingMode>[\\][mh]box/{noletter} {
|
|
return MBOX;
|
|
}
|
|
<MMODE>[\\][mh]box/{noletter} {
|
|
mbox_within_math = true;
|
|
BEGIN( INITIAL);
|
|
return MBOX;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\][,;:!] {}
|
|
|
|
|
|
|
|
/* Footnotemanagement */
|
|
/* ---------------------------- */
|
|
<INITIAL,MMODE,NestingMode>[\\]footnotemark/{noletter} {
|
|
return FOOTNOTEMARK;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]footnotetext/{noletter} {
|
|
return FOOTNOTETEXT;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]footnote/{noletter} {
|
|
return FOOTNOTE;
|
|
}
|
|
|
|
|
|
/* Support for the Bibliography */
|
|
/* ---------------------------- */
|
|
[\\]begin[\{]thebibliography[\}][\{][^\}]*[\}] {
|
|
return BEGINBIBLIO;
|
|
}
|
|
[\\]end[\{]thebibliography[\}] {
|
|
return ENDBIBLIO;
|
|
}
|
|
[\\]newblock/{noletter} {}
|
|
[\\]cite{w}([\[][^\]]*[\]])?[\{][^\}]*[\}] {
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = yyleng;
|
|
return CITE;
|
|
}
|
|
[\\]bibitem{w}/{noletter} {
|
|
BEGIN( NestingMode);
|
|
return BIBITEM;
|
|
}
|
|
|
|
|
|
/* Grouping symbols */
|
|
/* ---------------- */
|
|
<INITIAL,MMODE,NestingMode>[\\][\{] {
|
|
yylval.character = '{';
|
|
return CHAR;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\][\}] {
|
|
yylval.character = '}';
|
|
return CHAR;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]left. {
|
|
yylval.character = yytext[5];
|
|
return CHAR;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>[\\]right. {
|
|
yylval.character = yytext[6];
|
|
return CHAR;
|
|
}
|
|
<INITIAL,CCMode,NestingMode>[\{] {
|
|
return '{';
|
|
}
|
|
<INITIAL,CCMode,NestingMode>[\}] {
|
|
return '}';
|
|
}
|
|
|
|
{ttblockintro} { /* A couple of TeX styles like {\tt ... */
|
|
return TTBLOCKINTRO;
|
|
}
|
|
{emblockintro} { return EMBLOCKINTRO; }
|
|
{itblockintro} { return ITBLOCKINTRO; }
|
|
{scblockintro} { return SCBLOCKINTRO; }
|
|
{bfblockintro} { return BFBLOCKINTRO; }
|
|
|
|
<NestingMode>[\[] {
|
|
return '[';
|
|
}
|
|
<NestingMode>[\]] {
|
|
return ']';
|
|
}
|
|
|
|
<NestingMode>[\(] {
|
|
return '(';
|
|
}
|
|
<NestingMode>[\)] {
|
|
return ')';
|
|
}
|
|
|
|
/* TeX macros */
|
|
/* -------------------------------------- */
|
|
<INITIAL,MMODE,NestingMode>[\\]((ref)|(ccTrue)|(ccFalse)|(kill)|(parskip)|(parindent))/{noletter} { // copy without warning
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
<INITIAL,MMODE,NestingMode>{texmacro} {
|
|
if (actual_defining) {
|
|
yylval.string.text = yytext;
|
|
} else {
|
|
yylval.string.text = fetchMacro( yytext);
|
|
if ( yylval.string.text == NULL) {
|
|
yylval.string.text = yytext;
|
|
if ( warn_switch) {
|
|
cerr << prog_name
|
|
<< ": warning: unknown macro " << yytext
|
|
<< " in line " << line_number
|
|
<< " of file `" << in_filename << "'."
|
|
<< endl;
|
|
}
|
|
}
|
|
}
|
|
yylval.string.len = -1;
|
|
actual_defining = false;
|
|
return STRING;
|
|
}
|
|
|
|
|
|
/* The rest: spaces and single characters */
|
|
/* -------------------------------------- */
|
|
[\\]?{ws} {
|
|
if ( *yytext == '\\') {
|
|
yylval.string.text = yytext + 1;
|
|
yylval.string.len = yyleng - 1;
|
|
} else {
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = yyleng;
|
|
}
|
|
return SPACE;
|
|
}
|
|
<CCMode,NestingMode>{ws} {
|
|
yylval.string.text = yytext;
|
|
yylval.string.len = yyleng;
|
|
return SPACE;
|
|
}
|
|
<CCMode>. {
|
|
yylval.character = yytext[0];
|
|
return CHAR;
|
|
}
|
|
<INITIAL,NestingMode>[\\][/] {}
|
|
<INITIAL,MMODE,NestingMode>[&] {
|
|
if ( tab_tag) {
|
|
yylval.string.text =
|
|
"</TD><TD ALIGN=LEFT VALIGN=TOP NOWRAP>";
|
|
yylval.string.len = -1;
|
|
return STRING;
|
|
}
|
|
yylval.string.text = html_multi_character(yytext[0]);
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
return STRING;
|
|
}
|
|
|
|
<INITIAL,NestingMode,MMODE,CPROGMode>. {
|
|
yylval.character = yytext[0];
|
|
if ( is_html_multi_character( yylval.character)) {
|
|
yylval.string.text = html_multi_character(
|
|
yylval.character);
|
|
yylval.string.len = strlen( yylval.string.text);
|
|
return STRING;
|
|
}
|
|
return CHAR;
|
|
}
|
|
%%
|
|
|
|
void init_scanner( FILE* in){
|
|
line_number = 1;
|
|
set_CCMode = 0;
|
|
set_NestingMode = 0;
|
|
set_INITIAL = 0;
|
|
unchecked_tag = 0;
|
|
current_in_stream = in;
|
|
stack_ptr = 0;
|
|
yyrestart( in);
|
|
}
|
|
|
|
void skipspaces( void) {
|
|
int c = yyinput();
|
|
while( c && c <= ' ')
|
|
c = yyinput();
|
|
unput( c);
|
|
}
|
|
|
|
void skipoptionalparam( void) {
|
|
int c = yyinput();
|
|
while( c && c <= ' ')
|
|
c = yyinput();
|
|
if ( c == '[')
|
|
while( c && c != ']')
|
|
c = yyinput();
|
|
else
|
|
unput( c);
|
|
}
|