gpt4 book ai didi

c - 使用 Bison 时的错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:27:43 24 4
gpt4 key购买 nike

现在我得到了其他东西。当我执行 bison -d calc.y 时,我在控制台中得到很多源代码(有很多 m4_define),但它不会生成任何文件。现在我的代码是这样的:

%{
#define YYSTYPE double
#include <math.h>
%}
%token NUM
%%
input: /* empty */
| input line
;

line: '\n'
| exp '\n' { printf ("\t%.10g\n", $1); }
;

exp: NUM { $$ = $1; }
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
| exp exp '*' { $$ = $1 * $2; }
| exp exp '/' { $$ = $1 / $2; }
/* Exponentiation */
| exp exp '^' { $$ = pow ($1, $2); }
/* Unary minus */
| exp 'n' { $$ = -$1; }
;
%%

/* Lexical analyzer returns a double floating point
number on the stack and the token NUM, or the ASCII
character read if not a number. Skips all blanks
and tabs, returns 0 for EOF. */

#include <ctype.h>
#include <stdio.h>

yylex ()
{
int c;

/* skip white space */
while ((c = getchar ()) == ' ' || c == '\t')
;
/* process numbers */
if (c == '.' || isdigit (c))
{
ungetc (c, stdin);
scanf ("%lf", &yylval);
return NUM;
}
/* return end-of-file */
if (c == EOF)
return 0;
/* return single chars */
return c;
}

yyerror (s) /* Called by yyparse on error */
char *s;
{
printf ("%s\n", s);
}

main ()
{
yyparse ();
}

原始问题

我正在尝试创建我自己的开发语言,但它很难开始,而且在我开始的时候,我遇到了很多错误,我不知道如何解决。这是我的代码:

#include <ctype.h>
#include <stdio.h>

yylex ()
{
int c;

/* skip white space */
while ((c = getchar ()) == ' ' || c == '\t')
;
/* process numbers */
if (c == '.' || isdigit (c))
{
ungetc (c, stdin);
scanf ("%lf", &yylval);
return NUM;
}
/* return end-of-file */
if (c == EOF)
return 0;
/* return single chars */
return c;
}

main ()
{
yyparse ();
}

calc.y源代码文件:

%token NUM
%%
input:
| input line
;

line: '\n'
| exp '\n' { printf ("\t%.10g\n", $1); }
;

exp: NUM { $$ = $1; }
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
| exp exp '*' { $$ = $1 * $2; }
| exp exp '/' { $$ = $1 / $2; }
/* Exponentiation */
| exp exp '^' { $$ = pow ($1, $2); }
/* Unary minus */
| exp 'n' { $$ = -$1; }
;
%%

现在是编译器日志:

C:\Documents and Settings\Nathan Campos\Desktop>gcc calc.tab.c -lm -o rpcalc
calc.tab.c: In function `yylex':
calc.tab.c:15: error: `yylval' undeclared (first use in this function)
calc.tab.c:15: error: (Each undeclared identifier is reported only once
calc.tab.c:15: error: for each function it appears in.)
calc.tab.c:16: error: `NUM' undeclared (first use in this function)

怎么了?

最佳答案

修改后的答案

您提供的修改后的代码几乎可以干净地编译 - 您应该 #include <stdio.h>这样printf()在使用之前声明。 (您还应该为函数使用原型(prototype) - 例如 yyerror(const char *str) ,并且通常将代码拖入 21 世纪。)

它甚至可以正确响应“1 2 +”。

对于单个文件,您不需要使用 ' bison -d '.

如果您看到垃圾,则需要检查您的构建命令和构建环境。


原始答案

从哪里开始?

建议:在 Lex and Yacc 上获取 O'Reilly 的书(来自图书馆)或 Flex and Bison (2009 年 8 月的更新/重写——可能还没有在图书馆中)。如果您需要更快的资源,那么我建议 Unix Version 7手册或 GNU Bison manual - 两者都可以在线获得。特别是阅读关于 Lex 和 Yacc 的第 7 版文档;您不会尝试做原始描述中未涵盖的事情(尽管那里的 C 代码比 C89 标准早十年或更长时间)。

  • 您需要使用 bison -d生成包含 token 编号的 header 。对于源文件“zzz.y”,这将生成 C 代码“zzz.tab.c”和“zzz.tab.h”。
  • 您需要在主程序中包含“zzz.tab.h”。
  • 您需要使用 C99,因此应该在 yylex() 上有一个返回类型和 main() .
  • 您需要申报yylval .幸运的是,Bison 的“zzz.tab.h”文件可以正确地做到这一点;它并不像看起来那么简单。
  • 您可能希望在词法分析器 (-3.1416) 中允许使用负数。您可能也希望允许明确的正数 (+3.1416)。
  • 您可能需要确保“$$”和 friend 的类型为 double而不是默认类型 int (#define YYSTYPE double)。

关于c - 使用 Bison 时的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1551033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com