当前位置:首页 » 操作系统 » 语义分析源码

语义分析源码

发布时间: 2022-06-18 09:10:26

c语言词法分析器、语法分析器、语义分析器源码

bison 网上搜以下, 开源的

Ⅱ 关于java编译器中词法分析,语法分析,语义分析

请采纳

Ⅲ java语义分析

public class VariableTypeResolver {
private final String symbol;
private final ASTNode minScope;

private boolean methodLevel = true;
private boolean typeLevel = true;

/**
* The found result
*/
private SimpleName declSN;

private final ASTVisitor visitor = new ASTVisitor() {
@Override
public boolean visit(SimpleName sn) {
if (found()) {
return false;
}
if (sn.getIdentifier().equals(symbol) && sn.getParent() instanceof VariableDeclaration) {
declSN = sn;
return false;
}
return true;
}
};

/**
* Starts resolving with the requested symbol
* @param varSymbolNode the variable symbol node to resolve (node must be in the AST)
*/
public VariableTypeResolver(SimpleName varSymbolNode) {
this.symbol = varSymbolNode.getIdentifier();
this.minScope = varSymbolNode;
}

public VariableTypeResolver(String varSymbol, ASTNode minScope) {
this.symbol = varSymbol;
this.minScope = minScope;
}

public VariableTypeResolver disableMethodLevel() {
methodLevel = false;
return this;
}
public VariableTypeResolver disableTypeLevel() {
typeLevel = false;
return this;
}

/**
* Node's parent is instance of {@link VariableDeclarationFragment} or {@link SingleVariableDeclaration}
* @return the SimpleName node of declaration
*/
public SimpleName resolveDeclSimpleName() {
if (!found()) {
resolve();
}
return declSN;
}

private void resolve() {
if(found()) {return;}

if (methodLevel) {
apply(FindUpper.methodScope(minScope));
}

if(found()) {return;}

if (typeLevel) {
AbstractTypeDeclaration typeScope = FindUpper.abstractTypeScope(minScope);
applyInFields(typeScope);

if(found()) {return;}

for (TypeDeclaration superClass : superClasses(typeScope)) {
if(found()) {return;}
applyInFields(superClass);
}
}
}

private boolean found() {
return declSN != null;
}

private void apply(ASTNode scope) {
if (scope == null) {
throw new NullPointerException();
}
scope.accept(visitor);
}

private void applyInFields(AbstractTypeDeclaration typeScope) {
for (Object bd : typeScope.bodyDeclarations()) {
if (bd instanceof FieldDeclaration) {
apply((ASTNode) bd);
}
}
}

private List<TypeDeclaration> superClasses(AbstractTypeDeclaration atd) {
if (atd instanceof TypeDeclaration) {
return AstUtils.superClasses((TypeDeclaration) atd);
}
else {
return Collections.EMPTY_LIST;
}
}
}
也是网上找的

Ⅳ java语言的编译过程与一般编程语言的编译过程有何不同

  1. Java代码编译和执行的整个过程包含了以下三个重要的机制:

Java源码编译机制

类加载机制

类执行机制

  • Java源码编译机制

Java源码编译由以下三个过程组成:

分析和输入到符号表

注解处理

语义分析和生成class文件


  • JVM的类加载是通过ClassLoader及其子类来完成的

  • JVM是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方
    法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变
    量和参数,操作数栈中用于存放方法执行过程中产生的中间结果

Ⅳ 源代码是如何运行的

方法和详细的操作步骤如下:

1、第一步,打开任意网站,然后根据需要进行选择,见下图,转到下面的步骤。

Ⅵ 没安装gcc,是不是就不能用gcc的源码方式安装

当然是了,源码方式安装程序,都是把程序编译成可执行文件
如果没有安装的话,就没有编译的程序,所以就不用安装了

Ⅶ 简述将源程序编译成可执行程序的过程

一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。

预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则如下:

1、删除所有的#define,展开所有的宏定义。

2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。

3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。

4、删除所有的注释,“//”和“/**/”。

5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。

6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

(7)语义分析源码扩展阅读:

编译过程中语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。

其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。

Ⅷ 什么是编译器

编译器

编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。

[编辑]编译器工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为obj文件。再经过链接器的链接就可以生成最后的可执行代码了。有些时候我们需要把多个文件产生的目标文件进行链接,产生最后的代码。我们把一过程称为交叉链接。

一个现代编译器的主要工作流程如下:

* 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables)

工作原理

编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低级语言或机器言)。然而,也存在从低级语言到高级语言的编译器,这类编译器中用来从由高级语言生成的低级语言代码重新生成高级语言代码的又被叫做反编译器。也有从一种高级语言生成另一种高级语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。

典型的编译器输出是由包含入口点的名字和地址以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。

编译器种类

编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。交叉编译器在生成新的硬件平台时非常有用。“源码到源码编译器”是指用一种高级语言作为输入,输出也是高级语言的编译器。例如: 自动并行化编译器经常采用一种高级语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

预处理器(preprocessor)

作用是通过代入预定义等程序段将源程序补充完整。

编译器前端(frontend)

前端主要负责解析(parse)输入的源程序,由词法分析器和语法分析器协同工作。词法分析器负责把源程序中的‘单词’(Token)找出来,语法分析器把这些分散的单词按预先定义好的语法组装成有意义的表达式,语句 ,函数等等。 例如“a = b + c;”前端词法分析器看到的是“a, =, b , +, c;”,语法分析器按定义的语法,先把他们组装成表达式“b + c”,再组装成“a = b + c”的语句。 前端还负责语义(semantic checking)的检查,例如检测参与运算的变量是否是同一类型的,简单的错误处理。最终的结果常常是一个抽象的语法树(abstract syntax tree,或 AST),这样后端可以在此基础上进一步优化,处理。

编译器后端(backend)

编译器后端主要负责分析,优化中间代码(Intermediate representation)以及生成机器代码(Code Generation)。

一般说来所有的编译器分析,优化,变型都可以分成两大类: 函数内(intraproceral)还是函数之间(interproceral)进行。很明显,函数间的分析,优化更准确,但需要更长的时间来完成。

编译器分析(compiler analysis)的对象是前端生成并传递过来的中间代码,现代的优化型编译器(optimizing compiler)常常用好几种层次的中间代码来表示程序,高层的中间代码(high level IR)接近输入的源程序的格式,与输入语言相关(language dependent),包含更多的全局性的信息,和源程序的结构;中层的中间代码(middle level IR)与输入语言无关,低层的中间代码(Low level IR)与机器语言类似。 不同的分析,优化发生在最适合的那一层中间代码上。

常见的编译分析有函数调用树(call tree),控制流程图(Control flow graph),以及在此基础上的变量定义-使用,使用-定义链(define-use/use-define or u-d/d-u chain),变量别名分析(alias analysis),指针分析(pointer analysis),数据依赖分析(data dependence analysis)等等。

上述的程序分析结果是编译器优化(compiler optimization)和程序变形(compiler transformation)的前提条件。常见的优化和变新有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(array padding),等等。优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threaded code)。

机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)的策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形的工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令(instruction selection),如何合并几句代码成一句等等。

Ⅸ cmd调用gcc编译c源码,并传参

下面将通过对一个程序的编译来演示整个过程。

1
2
3
4
5
6
7

#include <stdio.h>

int main()
{
printf("happy new year!\n");
return 0;
}


1:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了
一条低级机器语言指令。

Ⅹ 想做一个编译器前端,非常简单的那种,包括词法分析,语法分析,语义,代码生成,只要能识别像a=10;这样的

编译器之类的程序,写起来不是很容易的,如果你感兴趣的话,可以看看GCC,LCC之类开源代码,里面就有你想要的东西

给你发个链接吧,GCC 3.3.5的源码
http://ftp.gnu.org/gnu/gcc/gcc-3.3.5/gcc-3.3.5.tar.gz

热点内容
如何制作薯仔服务器 发布:2024-11-07 05:27:49 浏览:811
机器码反编译教程 发布:2024-11-07 05:24:17 浏览:213
动迁三块砖算法 发布:2024-11-07 05:18:06 浏览:826
视窗压缩 发布:2024-11-07 04:45:06 浏览:887
fc2点此访问 发布:2024-11-07 04:45:04 浏览:760
上传吊牌图 发布:2024-11-07 04:38:48 浏览:919
密码学什么概念 发布:2024-11-07 04:38:48 浏览:848
linuxpdf转word 发布:2024-11-07 04:37:06 浏览:213
安卓手机为什么用ufs 发布:2024-11-07 04:15:09 浏览:559
数据库删除所有表 发布:2024-11-07 04:13:55 浏览:576