在“Unix 编程环境”一书中,这本书依赖于为编写“hoc”一章中的示例之外的所有示例编写自己的词法分析器。
我真的很想在第一个示例 hoc1 中看到 lex 的使用。当我尝试使用 lex 编写自己的程序时,程序不会输出响应,直到出现语法错误。
代码可以在
Unix programming environment website...
最佳答案
这似乎对我有用:
hoc1lex.l
$ cat hoc1lex.l
%{
extern int lineno;
#define YYSTYPE double
#include "y.tab.h"
%}
%%
[ \t]
\n { lineno++; return('\n'); }
[0-9]*\.[0-9]*([eE][-+][0-9]*)? { yylval = atof(yytext); return NUMBER; }
[0-9]+([eE][-+][0-9]*)? { yylval = atof(yytext); return NUMBER; }
. { return *yytext; }
%%
hoc.y 到 hoc1.y 的上下文差异
$ diff -u hoc.y hoc1.y
--- hoc.y 1995-06-12 16:30:21.000000000 -0700
+++ hoc1.y 2011-09-18 18:59:02.000000000 -0700
@@ -1,4 +1,5 @@
%{
+#include <stdio.h>
#define YYSTYPE double /* data type of yacc stack */
%}
%token NUMBER
@@ -19,7 +20,6 @@
%%
/* end of grammar */
-#include <stdio.h>
#include <ctype.h>
char *progname; /* for error messages */
int lineno = 1;
@@ -31,6 +31,7 @@
yyparse();
}
+#if 0
yylex() /* hoc1 */
{
int c;
@@ -48,6 +49,7 @@
lineno++;
return c;
}
+#endif /* 0 */
yyerror(s) /* called for yacc syntax error */
char *s;
hoc1.mk 生成文件
$ cat hoc1.mk
YFLAGS = -d
hoc1: hoc1.o hoc1lex.o
cc hoc1.o hoc1lex.o -o hoc1 -lfl
hoc1lex.o: y.tab.h
构建和测试
$ make -f hoc1.mk
yacc -d hoc1.y
mv -f y.tab.c hoc1.c
cc -c -o hoc1.o hoc1.c
lex -t hoc1lex.l > hoc1lex.c
cc -c -o hoc1lex.o hoc1lex.c
cc hoc1.o hoc1lex.o -o hoc1 -lfl
rm hoc1lex.c hoc1.c
$ ./hoc1
1.2 + 2.3
3.5
2.3/1.2
1.9166667
$
关于bison - "Unix Programming Environment"书中 Hoc1 的基本 Lex 文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7465268/