⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 turbo-c.notes

📁 C++版 词法分析、语法分析器
💻 NOTES
字号:
(Message inbox:25)
Date:  Tue, 29 Aug 89 18:57:48 pst
From:  few@quad1.quad.com (Frank Whaley)
Subject:  Re: flex 2.1 for Turbo C
To:  vern@cs.cornell.edu

> Sorry it's taken me so long to get back to you - I've been out of touch
> for about the last month.

I didn't expect to hear from you soon -- hope your journey was nice.

> I'd like to have your 'adjustments' for Turbo C, so if you still have
> them lying conveniently around, please mail them to me.  Thanks.

After a little more fiddling, the changes are relatively small.  Probably
the largest problem is that Turbo C does not yet claim to adhere to the
draft standard, so even though they support many "modern" constructs, they
still are not __STDC__.  Thus the diffs from flex.skl (note the name):

	62c62
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__
	104c104
	< #if !(defined(__STDC__) || defined(__TURBOC__))
	---
	> #ifndef __STDC__
	134c134
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__
	390c390
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__
	482c482
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__

and initscan.c:

	63c63
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__
	105c105
	< #if !(defined(__STDC__) || defined(__TURBOC__))
	---
	> #ifndef __STDC__
	677c677
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__
	1658c1658
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__
	1750c1750
	< #if defined(__STDC__) || defined(__TURBOC__)
	---
	> #ifdef __STDC__

are pretty simple.  BTW, simply adding -D__STDC__=1 to CFLAGS works, but
__STDC__ is used in many Turbo C header files, and can confuse things.
It would also mean that all flex-generated code must be compiled with
that flag.

flexdef.h also had one small problem:

	44,46c44
	< #ifndef MS_DOS
	< char *memset();		/*  should be declared in string.h  */
	< #endif
	---
	> char *memset();

as the Turbo C definiton of memset() is:
	void *memset(void *s, int c, size_t n);

The 128-byte command line limit of MS-DOS prevents us from using tcc to
link the objects together, so I provide a tlink script, flex.lnk:
-----
\turboc\lib\c0l+
ccl+
dfa+
ecs+
gen+
main+
misc+
nfa+
parse+
scan+
sym+
tblcmp+
yylex
flex.exe

\turboc\lib\cl
-----

The blank line is required.

The makefile needed a lot of hacking, so here it is in its entirety.
I don't think it is completely finished, but I'll be happy to work on
it more if you'd like.  Some of the changes are specific to my environment
(my yacc outputs ytab.c and ytab.h) and most MS-DOS people won't have
cp, mv and rm.  Some people like separate makefiles for different
systems, but we like one makefile with obscene parameterization.

I should note that all of my experiments with FLEX_FLAGS=-{c,f,F,e}
have failed, mostly due to scan.c becoming too large to be a single
module.  Damn toy operating system.
-----
# make file for "flex" tool

# @(#) $Header: c:\\program\040files\\development\\cvs\040repository/flex++/MISC/Turbo-C.notes,v 1.1.1.1 2002/04/13 06:01:33 Bear Exp $ (LBL)

# Porting considerations:
#
#    For BSD machines:
#  CFLAGS =
#  LDFLAGS = -s
#  LINK = $(CC) $(CFLAGS) -o flex $(LDFLAGS) $(FLEXOBJS)
#  SKELETON_DIR = .
#  SKELETON_FILE = flex.skel
#  SKELFLAGS = -DDEFAULT_SKELETON_FILE=\"$(SKELETON_DIR)/$(SKELETON_FILE)\"
#  O = o
#  YTAB = y.tab
#  FLEX = ./flex
#
#    For System V Unix or Vax/VMS machines, merely add:
#  CFLAGS = -DSYS_V
#
#    For MS-DOS, Turbo C:
CC = tcc
CFLAGS = -DSYS_V -DMS_DOS -O -G -Z -ml -v
LINK = tlink @flex.lnk/c/x/v
SKELETON_DIR = .
SKELETON_FILE = flex.skl
SKELFLAGS = -DDEFAULT_SKELETON_FILE="$(SKELETON_DIR)/$(SKELETON_FILE)"
O = obj
EXE = .exe
YTAB = ytab
FLEX = flex

#
# the first time around use "make first_flex"
#

FLEX_FLAGS =

FLEXOBJS = \
	ccl.$O \
	dfa.$O \
	ecs.$O \
	gen.$O \
	main.$O \
	misc.$O \
	nfa.$O \
	parse.$O \
	scan.$O \
	sym.$O \
	tblcmp.$O \
	yylex.$O

FLEX_C_SOURCES = \
	ccl.c \
	dfa.c \
	ecs.c \
	gen.c \
	main.c \
	misc.c \
	nfa.c \
	parse.c \
	scan.c \
	sym.c \
	tblcmp.c \
	yylex.c

flex$(EXE): $(FLEXOBJS)
	$(LINK)

first_flex:
	cp initscan.c scan.c
	$(MAKE) flex$(EXE)

parse.h parse.c: parse.y
	$(YACC) -d parse.y
	@mv $(YTAB).c parse.c
	@mv $(YTAB).h parse.h

scan.c: scan.l
	$(FLEX) -ist $(FLEX_FLAGS) scan.l >scan.c

scan.$O: scan.c parse.h

main.$O: main.c
	$(CC) $(CFLAGS) -c $(SKELFLAGS) main.c

flex.man: flex.1
	nroff -man flex.1 >flex.man

lint: $(FLEX_C_SOURCES)
	lint $(FLEX_C_SOURCES) > flex.lint

distrib:
	mv scan.c initscan.c
	chmod 444 initscan.c
	$(MAKE) clean

clean:
	rm -f core errs flex *.$O parse.c *.lint parse.h flex.man tags

tags:
	ctags $(FLEX_C_SOURCES)

vms:	flex.man
	$(MAKE) distrib

test:
	$(FLEX) -ist $(FLEX_FLAGS) scan.l | diff scan.c -
-----

BTW, thanks for a great tool.

Frank Whaley
Senior Development Engineer
Quadratron Systems Incorporated
few@quad1.quad.com
uunet!ccicpg!quad1!few
(Message inbox:8)
Date:  Thu, 31 Aug 89 14:57:36 pst
From:  few@quad1.quad.com (Frank Whaley)
Subject:  Re: flex 2.1 for Turbo C
To:  vern@cs.cornell.edu

> Thanks for the diffs and Makefile.  I'll endeavor to integrate them
> into the next release.

One terribly important thing I forgot -- Turbo C (and most MS-DOS C
compilers) provide only a 4K default stack.  Not having thoroughly
tested flex, I can't say that this is enough.  The makefile I provided
to you builds a version without stack checking code.  I would suggest
adding "-N" to CFLAGS, which will include some simple stack overflow
checking code.  You may wish to include the following lines to main.c:

	#ifdef __TURBOC__
	unsigned _stklen = 16384;	/*  some reasonably large number  */
	#endif

In addition, the flags in the makefile build a version with symbols
for Turbo Debugger (like -g).  You may wan't to leave these flags off
(remove "-v" from CFLAGS and "/v" from LINK) or you may wish to provide
an "install" target like so:

	BINDIR = {/usr/local/bin | c:\bin}
	STRIP = {strip | tdstrip}

	install: flex$(EXE)
		$(CP) flex$(EXE) $(BINDIR)
		$(STRIP) $(BINDIR)/flex$(EXE)

Regards,
	few

few@quad1.quad.com
uunet!ccicpg!quad1!few

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -