【发布时间】:2017-08-07 15:24:03
【问题描述】:
这是直接来自 Schreiner 和 Friedman 编译器书籍 page33 的 C(lex 驱动程序代码),刚刚输入它并抛出错误:
“错误:初始化元素不是编译时常量。
根据 K&R 第 124 页结构数组初始化,检查了具有不同名称的相同代码位。那里清楚地说明了编译时已知的这个 IS 的大小。这是 gcc 的问题吗? 我将命令行编译为: lex samplec.l;然后, cc -DDEBUG lex.yy.c -ll -o lexc ; 此时它会引发错误。 OBB
%{
/*
**
** samplec.l -- lexical analysia
**
*/
#ifdef DEBUG
# include <assert.h>
main ()
{
char * p;
assert(sizeof(int) >= sizeof(char *));
while (p = (char *) yylex())
printf("%-10.10s is \"%s\"\n",p, yytext);
}
s_lookup() {}
int yyerrs = 0;
# define token(x) (int) "x"
#else ! DEBUG
# define "y.tab.h"
# define token(x) x
#endif DEBUG
#define END(v) (v-1 + sizeof v / sizeof v[0])
static int screen();
%}
letter [a-zA-Z]
digit [0-9]
letter_or_digit [a-zA-Z0-9]
white_space [ \t\n]
blank [ \t]
other .
%%
^"#"{blank}*{digit}+({blank}+.*)?\n yymark();
">=" return token(GE);
"<=" return token(LE);
"==" return token(EQ);
"!=" return token(NE);
"+=" return token(PE);
"-=" return token(ME);
"*=" return token(TE);
"/=" return token(DE);
"%=" return token(RE);
"++" return token(PP);
"--" return token(MM);
{letter}{letter_or_digit} return screen();
{digit}+ { s_lookup(token(Constant));
return token(Constant);
}
{white_space}* ;
{other} return token(yytext[0]);
%%
/*
**
** reserve word screening
**
*/
static struct rwtable {
char *rw_name;
int rw_yylex;
} rwtable[] ={
"break", token(BREAK),
"continue", token(CONTINUE),
"else", token(ELSE),
"if", token(IF),
"int", token(INT),
"return", token(RETURN),
"while", token(WHILE)
};
static int screen()
{
struct rwtable * low = rwtable,
* high = END(rwtable),
* mid;
int c;
while (low <= high)
{
mid = low + (high-low)/2;
if ((c = strcmp(mid->rw_name, yytext)) == 0)
return mid->rw_yylex;
else if (c < 0)
low = mid+1;
else
high = mid-1;
}
s_lookup(token(Identifier));
return token(Identifier);
}
【问题讨论】:
-
请发minimal reproducible example - 这里缺少完整的内容。
-
token是函数吗? -
您缺少一个初始化层次结构,即一些
{}对。请仔细检查您是否真的逐字逐句复制了这本书。 -
token的定义是什么? -
@AnttiHaapala 请求的 MCVE 当然不可编译。在这种情况下,“可验证”的意思是,它得到的只是你所询问的错误。
标签: c