C语言指针原理教程:语法树及代码实现

2023年 7月 14日 56.0k 0

tcctok.h定义了C语言的词法分析的基本元素,主要定义了关键字。

/ keywords / DEF(TOK_INT, "int") DEF(TOK_VOID, "void") DEF(TOK_CHAR, "char") DEF(TOK_IF, "if") DEF(TOK_ELSE, "else") DEF(TOK_WHILE, "while") DEF(TOK_BREAK, "break") DEF(TOK_RETURN, "return") DEF(TOK_FOR, "for") DEF(TOK_EXTERN, "extern") DEF(TOK_STATIC, "static") DEF(TOK_UNSIGNED, "unsigned") DEF(TOK_GOTO, "goto") DEF(TOK_DO, "do") DEF(TOK_CONTINUE, "continue") DEF(TOK_SWITCH, "switch") DEF(TOK_CASE, "case")

..............................

..............................

..............................

同时定义了条件编译的相关内容

/*****/ / the following are not keywords. They are included to ease parsing / / preprocessor only / DEF(TOK_DEFINE, "define") DEF(TOK_INCLUDE, "include") DEF(TOK_INCLUDE_NEXT, "include_next") DEF(TOK_IFDEF, "ifdef") DEF(TOK_IFNDEF, "ifndef") DEF(TOK_ELIF, "elif") DEF(TOK_ENDIF, "endif") DEF(TOK_DEFINED, "defined")

在i386-tok.h中定义了汇编的相关关键词

/ ------------------------------------------------------------------ / / WARNING: relative order of tokens is important. /

/ register / DEF_ASM(al) DEF_ASM(cl) DEF_ASM(dl) DEF_ASM(bl) DEF_ASM(ah) DEF_ASM(ch) DEF_ASM(dh) DEF_ASM(bh) DEF_ASM(ax) DEF_ASM(cx) DEF_ASM(dx) DEF_ASM(bx) DEF_ASM(sp) DEF_ASM(bp) DEF_ASM(si) DEF_ASM(di) DEF_ASM(eax) DEF_ASM(ecx) DEF_ASM(edx) DEF_ASM(ebx) DEF_ASM(esp) DEF_ASM(ebp) DEF_ASM(esi) DEF_ASM(edi) #ifdef TCC_TARGET_X86_64 DEF_ASM(rax) DEF_ASM(rcx) DEF_ASM(rdx)

...........................

............................

在x86_64-asm.h中定义了64位汇编相关关键字

     DEF_ASM_OP0(clc, 0xf8) / must be first OP0 / DEF_ASM_OP0(cld, 0xfc) DEF_ASM_OP0(cli, 0xfa) DEF_ASM_OP0(clts, 0x0f06) DEF_ASM_OP0(cmc, 0xf5) DEF_ASM_OP0(lahf, 0x9f) DEF_ASM_OP0(sahf, 0x9e) DEF_ASM_OP0(pushfl, 0x9c) DEF_ASM_OP0(popfl, 0x9d) DEF_ASM_OP0(pushf, 0x9c) DEF_ASM_OP0(popf, 0x9d) DEF_ASM_OP0(stc, 0xf9) DEF_ASM_OP0(std, 0xfd) DEF_ASM_OP0(sti, 0xfb) DEF_ASM_OP0(aaa, 0x37)

先从几个重要文件入手。

libtcc.c

/
  TCC - Tiny C Compiler
 
  Copyright (c) 2001-2004 Fabrice Bellard
 
 This library is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2 of the License, or (at your option) any later version.
 
 This library is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 Lesser General Public License for more details.
 
 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include "tcc.h"

/****/
/ global variables /
使用GCC扩展还是TCC扩展

/ use GNU C extensions /
ST_DATA int gnu_ext = 1;

/ use TinyCC extensions /
ST_DATA int tcc_ext = 1;

ST_DATA 结构标注TCC状态。
/ XXX: get rid of this ASAP /
ST_DATA struct TCCState *tcc_state;

/****/

根据标志包含一些相应TCC文件。

#ifdef ONE_SOURCE #include "tccpp.c" #include "tccgen.c" #include "tccelf.c" #include "tccrun.c" #ifdef TCC_TARGET_I386 #include "i386-gen.c" #endif #ifdef TCC_TARGET_ARM #include "arm-gen.c" #endif #ifdef TCC_TARGET_C67 #include "c67-gen.c" #endif #ifdef TCC_TARGET_X86_64 #include "x86_64-gen.c" #endif #ifdef CONFIG_TCC_ASM #include "tccasm.c" #if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 #include "i386-asm.c" #endif #endif #ifdef TCC_TARGET_COFF #include "tcccoff.c" #endif #ifdef TCC_TARGET_PE #include "tccpe.c" #endif #endif / ONE_SOURCE /

CONFIG_TCC_ASM打开内联汇编的开关 /****/ #ifndef CONFIG_TCC_ASM ST_FUNC void asm_instr(void) { tcc_error("inline asm() not supported"); } ST_FUNC void asm_global_instr(void) { tcc_error("inline asm() not supported"); } #endif

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论