Related articles |
---|
lex and a C style preprocessor sam.ravnborg@image.dk (1997-03-14) |
Re: lex and a C style preprocessor plugge@biv7.sr.fh-mannheim.de (1997-03-18) |
From: | plugge@biv7.sr.fh-mannheim.de (Michel) |
Newsgroups: | comp.compilers |
Date: | 18 Mar 1997 12:45:42 -0500 |
Organization: | Fachhochschule Mannheim - Hochschule fuer Technik und Gestaltung, Germany |
References: | 97-03-064 |
Keywords: | C, tools |
sam.ravnborg@image.dk (Sam Ravnborg) writes:
|>Anyone out there who have implemented a lexer (based on (f)lex) that
|>supports preprocessor directives?
|>I need only the basic syntax:
|>#define <identifier>
|>#undef <identifier>
|>#ifdef <identifier>
|>#elif <identifier>
|>#else
|>#endif
Sam,
I wrote a preprocessor for a larger project. It supports some logical
tests (identifier can have the values 1 (false), 2 (true) or 3
("both": "true and false"); test can be done for true, false, both,
only true, only false (-> not for "both"), only "both"; it supports
also file inclusion, multiple threads (see the example),
"abbreviation" identifiers (may be different for different threads),
line concatenation and some more. The syntax is different from the C
preprocessor syntax, because I use it for FLEX programs, and it should
_not_ resolve the C commands (otherwise one could also use the CPP
preprocessor).
If you are interested, let me know.
Best regards
Michel
**********************************************************************************
file lx2l_demo.lx:
**********************************************************************************
* The first part consists of LX declarations. The value of DEBUG and EMBEDDED_LATEX
* are read from the file config.h, the definitions for GERMAN and USE_PLAIN are
* included here.
@@# DEBUG * include FLEX debug code for compilation with DEBUG=1
@@# EMBEDDED_LATEX * include rules and code for embedded LaTeX
@@# GERMAN NO * include special rules for german language (txt2ltx)
@@# USE_PLAIN YES * include rules and code for plain text (txt2ltx only)
* now read the include files with the LX conditionals:
{@@+ <config.h>} * general definitions of LX conditionals
{@@+ <split.h>} * definition of SPLIT_CVT2LTX
{@@c}{@output_name <test_c.l>}
{@@i}{@output_name <test_i.l>}
{@@t}{@output_name <test_t.l>}
@# str_cmt
{@@t}
{@@i}<STRING1,STRING2,COMMENT1>
{@@c}<STRING1,STRING2,COMMENT1,COMMENT2>
@# el_cmt
{@@t}<{@@#EMBEDDED_LATEX+}EL,EL_SPC{@@#USE_PLAIN+},{@@#EMBEDDED_LATEX#}PLAIN{@@##}
{@@#GERMAN+},PLAIN_G{@@#GERMAN#}{@@#USE_PLAIN-}{@@#EMBEDDED_LATEX-}{@@##}
DUMMY{@@#USE_PLAIN#}{@@#EMBEDDED_LATEX#}>
{@@i}<{@@#EMBEDDED_LATEX+}EL,EL_SPC,{@@#EMBEDDED_LATEX#}COMMENT1>
{@@c}<{@@#EMBEDDED_LATEX+}EL,EL_SPC,{@@#EMBEDDED_LATEX#}COMMENT1,COMMENT2>
@# i_cmt
{@@t}{CMT}{SPO}
{@@i}{CMT}
{@@c}{SPO}
{@@@}
* the following line denotes the end of the LX declaration section
{@@-}
/* The following is part of a (or better 3) LEX file */
%{
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
{@@c}#include "c2ltx.h"
{@@i}#include "idl2ltx.h"
{@@t}#include "txt2ltx.h"
{@@@}#include "cvt2ltx.h"
%}
{@@#DEBUG+}
{@@} /* The following option line is included only, if DEBUG is defined as YES */
{@@@}%option debug
{@@#DEBUG#}
%%
{@@#EMBEDDED_LATEX+}
{@@@}
<READ_CFG>^"#embedded " init_tp(NULL,set_value_embedded);
{@@#EMBEDDED_LATEX#}
<READ_CFG>^"#font_size " init_tp(&font_size,set_value_text);
{@@c}
<READ_CFG>^"#header " init_cp(&header,set_value_char);
{@@ci}
{@#el_cmt}\([cC]\) fprintf(yyout,"{\\copyright}"); {@@##}
pos+=yyleng; {@@^t}line_length+=12;{@@@}
{@@t}
{@#str_cmt}[^ \f\\\t\n] substitute_string(yytext); char_pos++;
{@@c}<TEST1>{@#i_cmt}"/*\\"[clsv]?{WS} {
{@@i}<TEST1>{@#i_cmt}"/*\\"[iv]?{WS} {
A_LINE;
{@@t}<TEST1>{@#i_cmt}"/*\\"[cilsv]?{WS} {
{@@@}
if(*(yytext+yyleng-1)=='\n')line++;
BEGIN(TEST_EL_CMT);
#if DEBUG
if(debug && !quiet){
fprintf(stderr,"embedded LaTeX in line %d\n",line);
warn(1);
}
#endif
}
{@@#NEVER+}
**********************************************************************************
File config.h: standard C Header file.
**********************************************************************************
#define DEBUG YES
#define EMBEDDED_LATEX NO
**********************************************************************************
now show the files generated by lx2l (the comments showing the LXLINE can be suppressed):
**********************************************************************************
**********************************************************************************
File test_c.l
**********************************************************************************
%{
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "c2ltx.h"
#include "cvt2ltx.h"
%}
%option debug
%%
/* LXLINE 56 */
<READ_CFG>^"#font_size " init_tp(&font_size,set_value_text); /* LXLINE 61 */
<READ_CFG>^"#header " init_cp(&header,set_value_char); /* LXLINE 63 */
<COMMENT1,COMMENT2>\([cC]\) fprintf(yyout,"{\\copyright}"); pos+=yyleng;
line_length+=12; /* LXLINE 66 */
<TEST1>{SPO}"/*\\"[clsv]?{WS} { /* LXLINE 70 */
if(*(yytext+yyleng-1)=='\n')line++;
BEGIN(TEST_EL_CMT);
#if DEBUG
if(debug && !quiet){
fprintf(stderr,"embedded LaTeX in line %d\n",line);
warn(1);
}
#endif
}
/* LXLINE 84 */
**********************************************************************************
File test_i.l
**********************************************************************************
%{
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "idl2ltx.h"
#include "cvt2ltx.h"
%}
%option debug
%%
/* LXLINE 56 */
<READ_CFG>^"#font_size " init_tp(&font_size,set_value_text); /* LXLINE 61 */
<COMMENT1>\([cC]\) fprintf(yyout,"{\\copyright}"); pos+=yyleng;
#endif
#endif
#endif
}
/* LXLINE 84 */
**********************************************************************************
File test_t.l
**********************************************************************************
%{
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "txt2ltx.h"
#include "cvt2ltx.h"
%}
%option debug
%%
/* LXLINE 56 */
<READ_CFG>^"#font_size " init_tp(&font_size,set_value_text); /* LXLINE 61 */
/* LXLINE 66 */
[^ \f\\\t\n] substitute_string(yytext); char_pos++; /* LXLINE 68 */
/* LXLINE 69 */
<TEST1>{CMT}{SPO}"/*\\"[cilsv]?{WS} { /* LXLINE 73 */
if(*(yytext+yyleng-1)=='\n')line++;
BEGIN(TEST_EL_CMT);
#if DEBUG
if(debug && !quiet){
fprintf(stderr,"embedded LaTeX in line %d\n",line);
warn(1);
}
#endif
}
/* LXLINE 84 */
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.