Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
a88bab9a
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a88bab9a
编写于
3月 17, 2011
作者:
M
Michal Marek
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'genksyms-enum' into kbuild/kbuild
上级
00759c0e
303fc01f
变更
8
展开全部
显示空白变更内容
内联
并排
Showing
8 changed file
with
988 addition
and
863 deletion
+988
-863
scripts/genksyms/Makefile
scripts/genksyms/Makefile
+2
-2
scripts/genksyms/genksyms.c
scripts/genksyms/genksyms.c
+136
-56
scripts/genksyms/genksyms.h
scripts/genksyms/genksyms.h
+5
-2
scripts/genksyms/lex.c_shipped
scripts/genksyms/lex.c_shipped
+150
-277
scripts/genksyms/lex.l
scripts/genksyms/lex.l
+31
-13
scripts/genksyms/parse.c_shipped
scripts/genksyms/parse.c_shipped
+619
-452
scripts/genksyms/parse.h_shipped
scripts/genksyms/parse.h_shipped
+15
-57
scripts/genksyms/parse.y
scripts/genksyms/parse.y
+30
-4
未找到文件。
scripts/genksyms/Makefile
浏览文件 @
a88bab9a
...
...
@@ -28,9 +28,9 @@ $(obj)/keywords.c: $(obj)/keywords.gperf FORCE
# flex
quiet_cmd_lex.c
=
FLEX
$@
cmd_lex.c
=
flex
-o
$@
-d
$<
$(obj)
/parse.h
cmd_lex.c
=
flex
-o
$@
-d
$<
$(obj)/lex.c
:
$(obj)/lex.l $(obj)/
parse.h $(obj)/
keywords.c FORCE
$(obj)/lex.c
:
$(obj)/lex.l $(obj)/keywords.c FORCE
$(
call
if_changed,lex.c
)
cp
$@
$@
_shipped
...
...
scripts/genksyms/genksyms.c
浏览文件 @
a88bab9a
...
...
@@ -53,12 +53,22 @@ static int nsyms;
static
struct
symbol
*
expansion_trail
;
static
struct
symbol
*
visited_symbols
;
static
const
char
*
const
symbol_type_name
[]
=
{
"normal"
,
"typedef"
,
"enum"
,
"struct"
,
"union"
static
const
struct
{
int
n
;
const
char
*
name
;
}
symbol_types
[]
=
{
[
SYM_NORMAL
]
=
{
0
,
NULL
},
[
SYM_TYPEDEF
]
=
{
't'
,
"typedef"
},
[
SYM_ENUM
]
=
{
'e'
,
"enum"
},
[
SYM_STRUCT
]
=
{
's'
,
"struct"
},
[
SYM_UNION
]
=
{
'u'
,
"union"
},
[
SYM_ENUM_CONST
]
=
{
'E'
,
"enum constant"
},
};
static
int
equal_list
(
struct
string_list
*
a
,
struct
string_list
*
b
);
static
void
print_list
(
FILE
*
f
,
struct
string_list
*
list
);
static
struct
string_list
*
concat_list
(
struct
string_list
*
start
,
...);
static
struct
string_list
*
mk_node
(
const
char
*
string
);
static
void
print_location
(
void
);
static
void
print_type_name
(
enum
symbol_type
type
,
const
char
*
name
);
...
...
@@ -140,14 +150,20 @@ static unsigned long crc32(const char *s)
static
enum
symbol_type
map_to_ns
(
enum
symbol_type
t
)
{
if
(
t
==
SYM_TYPEDEF
)
t
=
SYM_NORMAL
;
else
if
(
t
==
SYM_UNION
)
t
=
SYM_STRUCT
;
switch
(
t
)
{
case
SYM_ENUM_CONST
:
case
SYM_NORMAL
:
case
SYM_TYPEDEF
:
return
SYM_NORMAL
;
case
SYM_ENUM
:
case
SYM_STRUCT
:
case
SYM_UNION
:
return
SYM_STRUCT
;
}
return
t
;
}
struct
symbol
*
find_symbol
(
const
char
*
name
,
enum
symbol_type
ns
)
struct
symbol
*
find_symbol
(
const
char
*
name
,
enum
symbol_type
ns
,
int
exact
)
{
unsigned
long
h
=
crc32
(
name
)
%
HASH_BUCKETS
;
struct
symbol
*
sym
;
...
...
@@ -158,6 +174,8 @@ struct symbol *find_symbol(const char *name, enum symbol_type ns)
sym
->
is_declared
)
break
;
if
(
exact
&&
sym
&&
sym
->
type
!=
ns
)
return
NULL
;
return
sym
;
}
...
...
@@ -180,10 +198,47 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
struct
string_list
*
defn
,
int
is_extern
,
int
is_reference
)
{
unsigned
long
h
=
crc32
(
name
)
%
HASH_BUCKETS
;
unsigned
long
h
;
struct
symbol
*
sym
;
enum
symbol_status
status
=
STATUS_UNCHANGED
;
/* The parser adds symbols in the order their declaration completes,
* so it is safe to store the value of the previous enum constant in
* a static variable.
*/
static
int
enum_counter
;
static
struct
string_list
*
last_enum_expr
;
if
(
type
==
SYM_ENUM_CONST
)
{
if
(
defn
)
{
free_list
(
last_enum_expr
,
NULL
);
last_enum_expr
=
copy_list_range
(
defn
,
NULL
);
enum_counter
=
1
;
}
else
{
struct
string_list
*
expr
;
char
buf
[
20
];
snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
enum_counter
++
);
if
(
last_enum_expr
)
{
expr
=
copy_list_range
(
last_enum_expr
,
NULL
);
defn
=
concat_list
(
mk_node
(
"("
),
expr
,
mk_node
(
")"
),
mk_node
(
"+"
),
mk_node
(
buf
),
NULL
);
}
else
{
defn
=
mk_node
(
buf
);
}
}
}
else
if
(
type
==
SYM_ENUM
)
{
free_list
(
last_enum_expr
,
NULL
);
last_enum_expr
=
NULL
;
enum_counter
=
0
;
if
(
!
name
)
/* Anonymous enum definition, nothing more to do */
return
NULL
;
}
h
=
crc32
(
name
)
%
HASH_BUCKETS
;
for
(
sym
=
symtab
[
h
];
sym
;
sym
=
sym
->
hash_next
)
{
if
(
map_to_ns
(
sym
->
type
)
==
map_to_ns
(
type
)
&&
strcmp
(
name
,
sym
->
name
)
==
0
)
{
...
...
@@ -247,8 +302,12 @@ static struct symbol *__add_symbol(const char *name, enum symbol_type type,
sym
->
is_override
=
0
;
if
(
flag_debug
)
{
if
(
symbol_types
[
type
].
name
)
fprintf
(
debugfile
,
"Defn for %s %s == <"
,
symbol_type_name
[
type
],
name
);
symbol_types
[
type
].
name
,
name
);
else
fprintf
(
debugfile
,
"Defn for type%d %s == <"
,
type
,
name
);
if
(
is_extern
)
fputs
(
"extern "
,
debugfile
);
print_list
(
debugfile
,
defn
);
...
...
@@ -288,6 +347,35 @@ void free_list(struct string_list *s, struct string_list *e)
}
}
static
struct
string_list
*
mk_node
(
const
char
*
string
)
{
struct
string_list
*
newnode
;
newnode
=
xmalloc
(
sizeof
(
*
newnode
));
newnode
->
string
=
xstrdup
(
string
);
newnode
->
tag
=
SYM_NORMAL
;
newnode
->
next
=
NULL
;
return
newnode
;
}
static
struct
string_list
*
concat_list
(
struct
string_list
*
start
,
...)
{
va_list
ap
;
struct
string_list
*
n
,
*
n2
;
if
(
!
start
)
return
NULL
;
for
(
va_start
(
ap
,
start
);
(
n
=
va_arg
(
ap
,
struct
string_list
*
));)
{
for
(
n2
=
n
;
n2
->
next
;
n2
=
n2
->
next
)
;
n2
->
next
=
start
;
start
=
n
;
}
va_end
(
ap
);
return
start
;
}
struct
string_list
*
copy_node
(
struct
string_list
*
node
)
{
struct
string_list
*
newnode
;
...
...
@@ -299,6 +387,22 @@ struct string_list *copy_node(struct string_list *node)
return
newnode
;
}
struct
string_list
*
copy_list_range
(
struct
string_list
*
start
,
struct
string_list
*
end
)
{
struct
string_list
*
res
,
*
n
;
if
(
start
==
end
)
return
NULL
;
n
=
res
=
copy_node
(
start
);
for
(
start
=
start
->
next
;
start
!=
end
;
start
=
start
->
next
)
{
n
->
next
=
copy_node
(
start
);
n
=
n
->
next
;
}
n
->
next
=
NULL
;
return
res
;
}
static
int
equal_list
(
struct
string_list
*
a
,
struct
string_list
*
b
)
{
while
(
a
&&
b
)
{
...
...
@@ -346,8 +450,8 @@ static struct string_list *read_node(FILE *f)
if
(
node
.
string
[
1
]
==
'#'
)
{
int
n
;
for
(
n
=
0
;
n
<
ARRAY_SIZE
(
symbol_type
_name
);
n
++
)
{
if
(
node
.
string
[
0
]
==
symbol_type
_name
[
n
][
0
]
)
{
for
(
n
=
0
;
n
<
ARRAY_SIZE
(
symbol_type
s
);
n
++
)
{
if
(
node
.
string
[
0
]
==
symbol_type
s
[
n
].
n
)
{
node
.
tag
=
n
;
node
.
string
+=
2
;
return
copy_node
(
&
node
);
...
...
@@ -397,8 +501,8 @@ static void read_reference(FILE *f)
static
void
print_node
(
FILE
*
f
,
struct
string_list
*
list
)
{
if
(
list
->
tag
!=
SYM_NORMAL
)
{
putc
(
symbol_type
_name
[
list
->
tag
][
0
]
,
f
);
if
(
symbol_types
[
list
->
tag
].
n
)
{
putc
(
symbol_type
s
[
list
->
tag
].
n
,
f
);
putc
(
'#'
,
f
);
}
fputs
(
list
->
string
,
f
);
...
...
@@ -468,8 +572,9 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
crc
=
partial_crc32_one
(
' '
,
crc
);
break
;
case
SYM_ENUM_CONST
:
case
SYM_TYPEDEF
:
subsym
=
find_symbol
(
cur
->
string
,
cur
->
tag
);
subsym
=
find_symbol
(
cur
->
string
,
cur
->
tag
,
0
);
/* FIXME: Bad reference files can segfault here. */
if
(
subsym
->
expansion_trail
)
{
if
(
flag_dump_defs
)
...
...
@@ -486,55 +591,30 @@ static unsigned long expand_and_crc_sym(struct symbol *sym, unsigned long crc)
case
SYM_STRUCT
:
case
SYM_UNION
:
case
SYM_ENUM
:
subsym
=
find_symbol
(
cur
->
string
,
cur
->
tag
);
subsym
=
find_symbol
(
cur
->
string
,
cur
->
tag
,
0
);
if
(
!
subsym
)
{
struct
string_list
*
n
,
*
t
=
NULL
;
struct
string_list
*
n
;
error_with_pos
(
"expand undefined %s %s"
,
symbol_type
_name
[
cur
->
tag
]
,
symbol_type
s
[
cur
->
tag
].
name
,
cur
->
string
);
n
=
xmalloc
(
sizeof
(
*
n
));
n
->
string
=
xstrdup
(
symbol_type_name
[
cur
->
tag
]);
n
->
tag
=
SYM_NORMAL
;
n
->
next
=
t
;
t
=
n
;
n
=
xmalloc
(
sizeof
(
*
n
));
n
->
string
=
xstrdup
(
cur
->
string
);
n
->
tag
=
SYM_NORMAL
;
n
->
next
=
t
;
t
=
n
;
n
=
xmalloc
(
sizeof
(
*
n
));
n
->
string
=
xstrdup
(
"{"
);
n
->
tag
=
SYM_NORMAL
;
n
->
next
=
t
;
t
=
n
;
n
=
xmalloc
(
sizeof
(
*
n
));
n
->
string
=
xstrdup
(
"UNKNOWN"
);
n
->
tag
=
SYM_NORMAL
;
n
->
next
=
t
;
t
=
n
;
n
=
xmalloc
(
sizeof
(
*
n
));
n
->
string
=
xstrdup
(
"}"
);
n
->
tag
=
SYM_NORMAL
;
n
->
next
=
t
;
t
=
n
;
n
=
concat_list
(
mk_node
(
symbol_types
[
cur
->
tag
].
name
),
mk_node
(
cur
->
string
),
mk_node
(
"{"
),
mk_node
(
"UNKNOWN"
),
mk_node
(
"}"
),
NULL
);
subsym
=
add_symbol
(
cur
->
string
,
cur
->
tag
,
n
,
0
);
}
if
(
subsym
->
expansion_trail
)
{
if
(
flag_dump_defs
)
{
fprintf
(
debugfile
,
"%s %s "
,
symbol_type
_name
[
cur
->
tag
]
,
symbol_type
s
[
cur
->
tag
].
name
,
cur
->
string
);
}
crc
=
partial_crc32
(
symbol_type
_name
[
cur
->
tag
]
,
crc
=
partial_crc32
(
symbol_type
s
[
cur
->
tag
].
name
,
crc
);
crc
=
partial_crc32_one
(
' '
,
crc
);
crc
=
partial_crc32
(
cur
->
string
,
crc
);
...
...
@@ -565,7 +645,7 @@ void export_symbol(const char *name)
{
struct
symbol
*
sym
;
sym
=
find_symbol
(
name
,
SYM_NORMAL
);
sym
=
find_symbol
(
name
,
SYM_NORMAL
,
0
);
if
(
!
sym
)
error_with_pos
(
"export undefined symbol %s"
,
name
);
else
{
...
...
@@ -624,8 +704,8 @@ static void print_location(void)
static
void
print_type_name
(
enum
symbol_type
type
,
const
char
*
name
)
{
if
(
type
!=
SYM_NORMAL
)
fprintf
(
stderr
,
"%s %s"
,
symbol_type
_name
[
type
]
,
name
);
if
(
symbol_types
[
type
].
name
)
fprintf
(
stderr
,
"%s %s"
,
symbol_type
s
[
type
].
name
,
name
);
else
fprintf
(
stderr
,
"%s"
,
name
);
}
...
...
@@ -771,8 +851,8 @@ int main(int argc, char **argv)
if
(
sym
->
is_override
)
fputs
(
"override "
,
dumpfile
);
if
(
sym
->
type
!=
SYM_NORMAL
)
{
putc
(
symbol_type
_name
[
sym
->
type
][
0
]
,
dumpfile
);
if
(
sym
bol_types
[
sym
->
type
].
n
)
{
putc
(
symbol_type
s
[
sym
->
type
].
n
,
dumpfile
);
putc
(
'#'
,
dumpfile
);
}
fputs
(
sym
->
name
,
dumpfile
);
...
...
scripts/genksyms/genksyms.h
浏览文件 @
a88bab9a
...
...
@@ -26,7 +26,8 @@
#include <stdio.h>
enum
symbol_type
{
SYM_NORMAL
,
SYM_TYPEDEF
,
SYM_ENUM
,
SYM_STRUCT
,
SYM_UNION
SYM_NORMAL
,
SYM_TYPEDEF
,
SYM_ENUM
,
SYM_STRUCT
,
SYM_UNION
,
SYM_ENUM_CONST
};
enum
symbol_status
{
...
...
@@ -58,7 +59,7 @@ typedef struct string_list **yystype;
extern
int
cur_line
;
extern
char
*
cur_filename
;
struct
symbol
*
find_symbol
(
const
char
*
name
,
enum
symbol_type
ns
);
struct
symbol
*
find_symbol
(
const
char
*
name
,
enum
symbol_type
ns
,
int
exact
);
struct
symbol
*
add_symbol
(
const
char
*
name
,
enum
symbol_type
type
,
struct
string_list
*
defn
,
int
is_extern
);
void
export_symbol
(
const
char
*
);
...
...
@@ -66,6 +67,8 @@ void export_symbol(const char *);
void
free_node
(
struct
string_list
*
list
);
void
free_list
(
struct
string_list
*
s
,
struct
string_list
*
e
);
struct
string_list
*
copy_node
(
struct
string_list
*
);
struct
string_list
*
copy_list_range
(
struct
string_list
*
start
,
struct
string_list
*
end
);
int
yylex
(
void
);
int
yyparse
(
void
);
...
...
scripts/genksyms/lex.c_shipped
浏览文件 @
a88bab9a
此差异已折叠。
点击以展开。
scripts/genksyms/lex.l
浏览文件 @
a88bab9a
...
...
@@ -55,10 +55,6 @@ CHAR L?\'([^\\\']*\\.)*[^\\\']*\'
MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
/* Version 2 checksumming does proper tokenization; version 1 wasn't
quite so pedantic. */
%s V2_TOKENS
/* We don't do multiple input files. */
%option noyywrap
...
...
@@ -84,9 +80,9 @@ MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
recognized as tokens. We don't actually use them since we don't
parse expressions, but we do want whitespace to be arranged
around them properly. */
<V2_TOKENS>{MC_TOKEN}
return OTHER;
<V2_TOKENS>{INT}
return INT;
<V2_TOKENS>{REAL}
return REAL;
{MC_TOKEN}
return OTHER;
{INT}
return INT;
{REAL}
return REAL;
"..." return DOTS;
...
...
@@ -103,12 +99,23 @@ MC_TOKEN ([~%^&*+=|<>/-]=)|(&&)|("||")|(->)|(<<)|(>>)
/* Macros to append to our phrase collection list. */
/*
* We mark any token, that that equals to a known enumerator, as
* SYM_ENUM_CONST. The parser will change this for struct and union tags later,
* the only problem is struct and union members:
* enum e { a, b }; struct s { int a, b; }
* but in this case, the only effect will be, that the ABI checksums become
* more volatile, which is acceptable. Also, such collisions are quite rare,
* so far it was only observed in include/linux/telephony.h.
*/
#define _APP(T,L) do { \
cur_node = next_node; \
next_node = xmalloc(sizeof(*next_node)); \
next_node->next = cur_node; \
cur_node->string = memcpy(xmalloc(L+1), T, L+1); \
cur_node->tag = SYM_NORMAL; \
cur_node->tag = \
find_symbol(cur_node->string, SYM_ENUM_CONST, 1)?\
SYM_ENUM_CONST : SYM_NORMAL ; \
} while (0)
#define APP _APP(yytext, yyleng)
...
...
@@ -134,7 +141,6 @@ yylex(void)
if (lexstate == ST_NOTSTARTED)
{
BEGIN(V2_TOKENS);
next_node = xmalloc(sizeof(*next_node));
next_node->next = NULL;
lexstate = ST_NORMAL;
...
...
@@ -187,8 +193,8 @@ repeat:
case STRUCT_KEYW:
case UNION_KEYW:
dont_want_brace_phrase = 3;
case ENUM_KEYW:
dont_want_brace_phrase = 3;
suppress_type_lookup = 2;
goto fini;
...
...
@@ -198,8 +204,7 @@ repeat:
}
if (!suppress_type_lookup)
{
struct symbol *sym = find_symbol(yytext, SYM_TYPEDEF);
if (sym && sym->type == SYM_TYPEDEF)
if (find_symbol(yytext, SYM_TYPEDEF, 1))
token = TYPE;
}
}
...
...
@@ -318,7 +323,20 @@ repeat:
++count;
APP;
goto repeat;
case ')': case ']': case '}':
case '}':
/* is this the last line of an enum declaration? */
if (count == 0)
{
/* Put back the token we just read so's we can find it again
after registering the expression. */
unput(token);
lexstate = ST_NORMAL;
token = EXPRESSION_PHRASE;
break;
}
/* FALLTHRU */
case ')': case ']':
--count;
APP;
goto repeat;
...
...
scripts/genksyms/parse.c_shipped
浏览文件 @
a88bab9a
此差异已折叠。
点击以展开。
scripts/genksyms/parse.h_shipped
浏览文件 @
a88bab9a
/* A Bison parser, made by GNU Bison 2.3. */
/* A Bison parser, made by GNU Bison 2.4.1. */
/* Skeleton interface for Bison's Yacc-like parsers in C
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This program is free software
;
you can redistribute it and/or modify
This program is free software
:
you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation
; either version 2, or (at your option)
any later version.
the Free Software Foundation
, either version 3 of the License, or
(at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
...
...
@@ -16,9 +17,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
...
...
@@ -33,6 +32,7 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
...
...
@@ -82,58 +82,16 @@
FILENAME = 298
};
#endif
/* Tokens. */
#define ASM_KEYW 258
#define ATTRIBUTE_KEYW 259
#define AUTO_KEYW 260
#define BOOL_KEYW 261
#define CHAR_KEYW 262
#define CONST_KEYW 263
#define DOUBLE_KEYW 264
#define ENUM_KEYW 265
#define EXTERN_KEYW 266
#define EXTENSION_KEYW 267
#define FLOAT_KEYW 268
#define INLINE_KEYW 269
#define INT_KEYW 270
#define LONG_KEYW 271
#define REGISTER_KEYW 272
#define RESTRICT_KEYW 273
#define SHORT_KEYW 274
#define SIGNED_KEYW 275
#define STATIC_KEYW 276
#define STRUCT_KEYW 277
#define TYPEDEF_KEYW 278
#define UNION_KEYW 279
#define UNSIGNED_KEYW 280
#define VOID_KEYW 281
#define VOLATILE_KEYW 282
#define TYPEOF_KEYW 283
#define EXPORT_SYMBOL_KEYW 284
#define ASM_PHRASE 285
#define ATTRIBUTE_PHRASE 286
#define BRACE_PHRASE 287
#define BRACKET_PHRASE 288
#define EXPRESSION_PHRASE 289
#define CHAR 290
#define DOTS 291
#define IDENT 292
#define INT 293
#define REAL 294
#define STRING 295
#define TYPE 296
#define OTHER 297
#define FILENAME 298
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef int YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
#endif
extern YYSTYPE yylval;
scripts/genksyms/parse.y
浏览文件 @
a88bab9a
...
...
@@ -25,6 +25,7 @@
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "genksyms.h"
static int is_typedef;
...
...
@@ -227,16 +228,19 @@ type_specifier:
add_symbol(i->string, SYM_UNION, s, is_extern);
$$ = $3;
}
| ENUM_KEYW IDENT
BRACE_PHRASE
| ENUM_KEYW IDENT
enum_body
{ struct string_list *s = *$3, *i = *$2, *r;
r = copy_node(i); r->tag = SYM_ENUM;
r->next = (*$1)->next; *$3 = r; (*$1)->next = NULL;
add_symbol(i->string, SYM_ENUM, s, is_extern);
$$ = $3;
}
/* Anonymous s/u/e definitions. Nothing needs doing. */
| ENUM_KEYW BRACE_PHRASE { $$ = $2; }
/*
* Anonymous enum definition. Tell add_symbol() to restart its counter.
*/
| ENUM_KEYW enum_body
{ add_symbol(NULL, SYM_ENUM, NULL, 0); $$ = $2; }
/* Anonymous s/u definitions. Nothing needs doing. */
| STRUCT_KEYW class_body { $$ = $2; }
| UNION_KEYW class_body { $$ = $2; }
;
...
...
@@ -449,6 +453,28 @@ attribute_opt:
| attribute_opt ATTRIBUTE_PHRASE
;
enum_body:
'{' enumerator_list '}' { $$ = $3; }
| '{' enumerator_list ',' '}' { $$ = $4; }
;
enumerator_list:
enumerator
| enumerator_list ',' enumerator
enumerator:
IDENT
{
const char *name = strdup((*$1)->string);
add_symbol(name, SYM_ENUM_CONST, NULL, 0);
}
| IDENT '=' EXPRESSION_PHRASE
{
const char *name = strdup((*$1)->string);
struct string_list *expr = copy_list_range(*$3, *$2);
add_symbol(name, SYM_ENUM_CONST, expr, 0);
}
asm_definition:
ASM_PHRASE ';' { $$ = $2; }
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录