gpt4 book ai didi

c - Flex 中 '(' 标记之前的预期标识符或 '{'

转载 作者:行者123 更新时间:2023-12-02 03:54:07 25 4
gpt4 key购买 nike

我正在尝试使用 flexyacc解析“C”源代码。不幸的是,我在第 1,12,13,14 行收到错误“预期标识符或 '(' before '{' token”... 。有什么想法吗?


这是我的 flex 文件(称为 mini.l):

%{

%}
digit [0-9]
letter [a-zA-Z]
number (digit)+
id (letter|_)(letter|digit|_)*
integer (int)
character (char)
comma [,]
%%
{integer} {return INT;}
{character} {return CHAR;}
{number} {return NUM;}
{id} {return IDENTIFIER;}
{comma} {return ',';}
[-+*/] {return *yytext;}
. {}
%%
main()
{
yylex();
}

对应的yacc文件(名为my_yacc.y)如下图:
%{
#include <ctype.h>
#include <stdio.h>
/* #include "myhead.h" */
#include "mini.l"
#define YYSTYPE double
# undef fprintf
%}

%token INT
%token CHAR
%token IDENTIFIER
%token NUM
%token ','
%left '+' '-'
%left '*' '/'
%right UMINUS

%%

lines:lines expr '\n' {printf("%g\n",$2);}
|lines '\n'
|D
|
;
expr :expr '*' expr {$$=$1*$3;}
|expr '/' expr {$$=$1/$3;}
|expr '+' expr {$$=$1+$3;}
|expr '-' expr {$$=$1+$3;}
|'(' expr ')' {$$=$2;}
|'-' expr %prec UMINUS {$$=-$2;}
|IDENTIFIER {}
|NUM {}
;
T :INT {}
|CHAR {}
;
L :L ',' IDENTIFIER {}
|IDENTIFIER {}
;
D :T L {printf("T is %g, L is %g",$1,$2);}
;

%%
/*void yyerror (char *s)
{
fprintf (stderr, "%s\n", s);
}
*/

我正在使用以下命令编译生成的代码:
flex mini.l
yacc my_yacc.y
gcc y.tab.c -ly

最佳答案

您看到的错误来自 C 编译器,是由于您对 flex 和 yacc 如何协同工作的误解造成的。当我使用与您相同的工具运行它时,我收到以下错误,正如您所做的那样,正如@KeithThompson 所指出的:

In file included from my_yacc.y:5:0:
mini.l:1:1: error: expected identifier or '(' before '%' token
%{
^
mini.l:5:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before' letter'
letter [a-zA-Z]
^
mini.l:12:11: error: expected identifier or '(' before '{' token
{integer} {return INT;}
^
... elided the rest ...

虽然你已经使用了命令 flex , yaccgcc按照正确的顺序,您包含了文件 mini.l在你的野牛输入中。这是不正确的。您应该包括 输出 mini.l 创建的 flex 的.该文件名为 lex.yy.c .还需要在 yacc 输入文件的末尾包含它。 (这是因为如果你不这样做,你会收到@flolo 发现的错误)。如果您对 yacc 进行必要的更改文件,你将有这个:
%{
#include <ctype.h>
#include <stdio.h>
/* #include "myhead.h" */
/* #include "mini.l" */

#define YYSTYPE double
# undef fprintf
%}

%token INT
%token CHAR
%token IDENTIFIER
%token NUM
%token ','
%left '+' '-'
%left '*' '/'
%right UMINUS

%%

lines:lines expr '\n' {printf("%g\n",$2);}
|lines '\n'
|D
|
;
expr :expr '*' expr {$$=$1*$3;}
|expr '/' expr {$$=$1/$3;}
|expr '+' expr {$$=$1+$3;}
|expr '-' expr {$$=$1+$3;}
|'(' expr ')' {$$=$2;}
|'-' expr %prec UMINUS {$$=-$2;}
|IDENTIFIER {}
|NUM {}
;
T :INT {}
|CHAR {}
;
L :L ',' IDENTIFIER {}
|IDENTIFIER {}
;
D :T L {printf("T is %g, L is %g",$1,$2);}
;

%%
void yyerror (char *s)
{
fprintf (stderr, "%s\n", s);
}

#include "lex.yy.c"

如果你现在运行你的命令序列,你会发现它既能编译又能运行,还能正确处理 C 语言输入。

您犯的错误是新用户对工具的常见错误 flexyacc .

关于c - Flex 中 '(' 标记之前的预期标识符或 '{',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13413966/

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