为GCC添加中文关键字

简介: 通过修改gcc编译器源码, 添加中文关键词. Allow gcc to support unicode identifiers.

知乎原文地址 作者:@狗屎咖啡

GCC不支持UTF-8字符,可以自己添加:

如何使GCC支持中文(utf-8)的变量名、函数名?

也可以 用脚本转换源代码,再编译:

https://gcc.gnu.org/wiki/FAQ#utf8_identifiers

但是强烈建议打上支持UTF-8的补丁。

实例 swizl/gcn

添加关键字

在 gcc/c-family/c-common.c 中

const struct c_common_resword c_common_reswords[] 下添加

复制一行原关键字,再将字符串该成中文

例如

{ "asm",        RID_ASM,    D_ASM },
  { "汇编",        RID_ASM,    D_ASM },
  { "auto",        RID_AUTO,    0 },
  { "自动",        RID_AUTO,    0 },
  { "bool",        RID_BOOL,    D_CXXONLY | D_CXXWARN },
  { "布尔",        RID_BOOL,    D_CXXONLY | D_CXXWARN },    
  { "break",        RID_BREAK,    0 },
  { "断",        RID_BREAK,    0 },
  { "case",        RID_CASE,    0 },
  { "例",        RID_CASE,    0 },
  { "catch",        RID_CATCH,    D_CXX_OBJC | D_CXXWARN },
  { "抓",        RID_CATCH,    D_CXX_OBJC | D_CXXWARN },
  { "char",        RID_CHAR,    0 },
  { "字",        RID_CHAR,    0 },

添加中文宏关键字

在 libcpp/directives.c 中

1 添加宏定义A,仿照D,加一个参数name_cn. 因为原始GCC不支持UTF-8

name 中 name为中文时无法解析,所以name_cn直接对于字符串。

当然已经打了支持UTF-8的补丁,没有这个问题。兼容起见,还是按照这样改。

#define D(name, t, o, f) static void do_##name (cpp_reader *);
DIRECTIVE_TABLE
#undef D

#define D(n, tag, o, f) tag,
enum
{
  DIRECTIVE_TABLE
  N_DIRECTIVES
};
#undef D

#define D(name, t, origin, flags) \
{ do_##name, (const uchar *) #name, \
  sizeof #name - 1, origin, flags },
static const directive dtable[] =
{
DIRECTIVE_TABLE
};
#undef D

#define D(name, t, origin, flags) #name,
static const char * const directive_names[] = {
DIRECTIVE_TABLE
  NULL
};
#undef D

改成

#define A(name_cn, name, t, o, f)
#define D(name, t, o, f) static void do_##name (cpp_reader *);
DIRECTIVE_TABLE
#undef D
#undef A

#define A(n_cn, n, tag, o, f) tag ## _CN,
#define D(n, tag, o, f) tag,
enum
{
  DIRECTIVE_TABLE
  N_DIRECTIVES
};
#undef D
#undef A

#define A(name_cn, name, t, origin, flags) \
{ do_##name, (const uchar *) name_cn, \
  sizeof (name_cn) - 1, origin, flags },
#define D(name, t, origin, flags) \
{ do_##name, (const uchar *) #name, \
  sizeof #name - 1, origin, flags },
static const directive dtable[] =
{
DIRECTIVE_TABLE
};
#undef D
#undef A

#define A(name_cn, name, t, origin, flags) name_cn,
#define D(name, t, origin, flags) #name,
static const char * const directive_names[] = {
DIRECTIVE_TABLE
  NULL
};
#undef D
#undef A

2 添加宏关键字

在 #define DIRECTIVE_TABLE 中添加

复制一行原宏关键字,该D为A,添加中文名 字符串。

例如

#define DIRECTIVE_TABLE                            \
D(define,    T_DEFINE = 0,    KANDR,     IN_I)       /* 270554 */ \
A("定义", define,    T_DEFINE,    KANDR,     IN_I)       /* 270554 */ \
D(include,    T_INCLUDE,    KANDR,     INCL | EXPAND)  /*  52262 */ \
A("含", include,    T_INCLUDE,    KANDR,     INCL | EXPAND)  /*  52262 */ \
D(endif,    T_ENDIF,    KANDR,     COND)       /*  45855 */ \
A("了如", endif,    T_ENDIF,    KANDR,     COND)       /*  45855 */ \
D(ifdef,    T_IFDEF,    KANDR,     COND | IF_COND) /*  22000 */ \
A("如定义", ifdef,    T_IFDEF,    KANDR,     COND | IF_COND) /*  22000 */ \
D(if,        T_IF,        KANDR, COND | IF_COND | EXPAND) /*  18162 */ \
A("如", if,        T_IF,        KANDR, COND | IF_COND | EXPAND) /*  18162 */ \
D(else,        T_ELSE,        KANDR,     COND)       /*   9863 */ \
A("另", else,        T_ELSE,        KANDR,     COND)       /*   9863 */ \
D(ifndef,    T_IFNDEF,    KANDR,     COND | IF_COND) /*   9675 */ \
A("如未定义", ifndef,    T_IFNDEF,    KANDR,     COND | IF_COND) /*   9675 */ \
D(undef,    T_UNDEF,    KANDR,     IN_I)       /*   4837 */ \
A("消定义", undef,    T_UNDEF,    KANDR,     IN_I)       /*   4837 */ \
D(line,        T_LINE,        KANDR,     EXPAND)       /*   2465 */ \
A("行", line,        T_LINE,        KANDR,     EXPAND)       /*   2465 */ \
D(elif,        T_ELIF,        STDC89,    COND | EXPAND)  /*    610 */ \
A("另如", elif,        T_ELIF,        STDC89,    COND | EXPAND)  /*    610 */ \
D(error,    T_ERROR,    STDC89,    0)           /*    475 */ \
A("错误", error,    T_ERROR,    STDC89,    0)           /*    475 */ \
D(pragma,    T_PRAGMA,    STDC89,    IN_I)       /*    195 */ \
A("杂注", pragma,    T_PRAGMA,    STDC89,    IN_I)       /*    195 */ \
D(warning,    T_WARNING,    EXTENSION, 0)           /*     22 */ \
A("告警", warning,    T_WARNING,    EXTENSION, 0)           /*     22 */ \
D(include_next,    T_INCLUDE_NEXT,    EXTENSION, INCL | EXPAND)  /*     19 */ \
A("含下个", include_next,    T_INCLUDE_NEXT,    EXTENSION, INCL | EXPAND)  /*     19 */ \
D(ident,    T_IDENT,    EXTENSION, IN_I)           /*     11 */ \
D(import,    T_IMPORT,    EXTENSION, INCL | EXPAND)  /* 0 ObjC */    \
A("导入", import,    T_IMPORT,    EXTENSION, INCL | EXPAND)  /* 0 ObjC */    \
D(assert,    T_ASSERT,    EXTENSION, DEPRECATED)       /* 0 SVR4 */    \
A("断言", assert,    T_ASSERT,    EXTENSION, DEPRECATED)       /* 0 SVR4 */    \
D(unassert,    T_UNASSERT,    EXTENSION, DEPRECATED)       /* 0 SVR4 */    \
A("消断言", unassert,    T_UNASSERT,    EXTENSION, DEPRECATED)       /* 0 SVR4 */    \
D(sccs,        T_SCCS,        EXTENSION, IN_I)           /* 0 SVR4? */

make bootstrap && make install 之后,配合支持UTF-8的补丁,就可以愉快地用中文关键字了。

2017-11-24

相关文章
|
6月前
|
编译器 Linux 开发工具
|
6月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
87 0
006.gcc编译器
|
6月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
|
3月前
|
前端开发 C语言
gcc动态库升级
gcc动态库升级
|
1月前
|
编译器 Linux C语言
gcc的编译过程
GCC(GNU Compiler Collection)的编译过程主要包括四个阶段:预处理、编译、汇编和链接。预处理展开宏定义,编译将代码转换为汇编语言,汇编生成目标文件,链接将目标文件与库文件合并成可执行文件。
69 11
|
3月前
|
编译器 开发工具 C语言
Gcc 链接文件
Gcc 链接文件
38 4
|
3月前
|
编译器 C语言 C++
MinGW安装gcc
MinGW安装gcc
92 0
|
5月前
|
自然语言处理 编译器 Go
GCC:GNU编译器
GCC:GNU编译器
|
5月前
|
Java 编译器 Linux
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
技术经验解读:【转载】详解GCC的下载和安装(源码安装)
168 0
|
5月前
|
C语言
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令
关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令