Базовый файл Lex для Hoc1 в книге "Среда программирования Unix" - PullRequest
3 голосов
/ 19 сентября 2011

В книге "Среда программирования Unix" книга опирается на написание своего собственного лексера для всех, кроме одного из примеров в главе по написанию "hoc".

Мне бы очень хотелось увидеть использование lex для первого примера hoc1. Когда я пытаюсь написать свой собственный с использованием lex, программа не выводит ответ, пока не обнаружит синтаксическую ошибку.

Код можно увидеть на Сайт среды программирования Unix ...

1 Ответ

5 голосов
/ 19 сентября 2011

Мне кажется, это работает:

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.mkmakefile

$ 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
$ 
...