❶ 编译器的组成及各部分的功能及作用
1. 词法分析 词法分析器根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。 2. 语法分析 语法分析器根据语法规则识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树。 3. 语义分析 语义分析器根据语义规则对语法树中的语法单元进行静态语义检查,如果类型检查和转换等,其目的在于保证语法正确的结构在语义上也是合法的。 4. 中间代码生成 中间代码生成器根据语义分析器的输出生成中间代码。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的一种中间代码是三地址码,它的一种实现方式是四元式。三地址码的优点是便于阅读、便于优化。 5. 中间代码优化 优化是编译器的一个重要组成部分,由于编译器将源程序翻译成中间代码的工作是机械的、按固定模式进行的,因此,生成的中间代码往往在时间和空间上有很大浪费。当需要生成高效目标代码时,就必须进行优化。 6. 目标代码生成 目标代码生成是编译器的最后一个阶段。在生成目标代码时要考虑以下几个问题:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。编译器生成的目标程序代码可以有多种形式:汇编语言、可重定位二进制代码、内存形式。 7 符号表管理 符号表的作用是记录源程序中符号的必要信息,并加以合理组织,从而在编译器的各个阶段能对它们进行快速、准确的查找和操作。符号表中的某些内容甚至要保留到程序的运行阶段。 8 出错处理用户编写的源程序中往往会有一些错误,可分为静态错误和动态错误两类。所谓动态错误,是指源程序中的逻辑错误,它们发生在程序运行的时候,也被称作动态语义错误,如变量取值为零时作为除数,数组元素引用时下标出界等。静态错误又可分为语法错误和静态语义错误。语法错误是指有关语言结构上的错误,如单词拼写错、表达式中缺少操作数、begin和end不匹配等。静态语义错误是指分析源程序时可以发现的语言意义上的错误,如加法的两个操作数中一个是整型变量名,而另一个是数组名等。
❷ flash里的编译器错误是什么意思啊
当发生错误时,flash里的编译器就会产生错误代码,每个代码代表不同的错误原因。
以下是不同错误代码表示的错误原因:
1000 对 _ 的引用不明确。
1003 不允许将访问说明符与命名空间属性结合使用。
1004 找不到命名空间,或者命名空间不是编译时常量。
1006 super 表达式只能在类实例方法的内部使用。
1007 super 语句只能在类实例构造函数的内部使用。
1008 属性无效。
1010 override 属性只能在类的属性定义中使用。
1011 virtual 属性只能在类的属性定义中使用。
1012 static 属性只能在类内部的定义中使用。
1013 private 属性只能在类的属性定义中使用。
1014 不再支持 intrinsic 属性。 ActionScript 3.0 does not support the intrinsic keyword.
1016 基类为 final 类。 无法扩展超类,因为它标记为 final。
1017 找不到基类 _ 的定义。
1018 类的定义 _ 重复。
1020 标记为 override 的方法必须覆盖其它方法。
1021 函数的定义重复。 在同一个范围内,不能使用相同的标识符名称声明多个函数。
1022 不能覆盖 final 存取器。
1023 覆盖不兼容。
1024 覆盖没有标记为 override 的函数。
1025 不能重新定义 final 方法。 不能扩展该方法,因为它在基类中标记为 final。
1026 构造函数必须是实例方法。
1027 函数不能同时为 static 和 override 函数。
1028 函数不能同时为 static 和 virtual 函数。
1029 函数不能同时为 final 和 virtual 函数。
1030 必须指定变量参数数组的名称。
1033 不支持 virtual 变量。
1034 变量不能是 native。
1035 变量不能同时为 final 和 virtual。
1037 不能嵌套包。
1038 找不到 break 语句的目标。
1039 找不到 continue 语句的目标。
1040 标签的定义重复。
1041 属性是不可调用的。
1042 this 关键字不能在 static 方法中使用。
1043 命名空间未定义。
1044 接口方法 _(属于命名空间 _)未经类 _ 实现。
1045 找不到接口 _。
1046 找不到类型,或者类型不是编译时常量 _。
1047 参数的初始值未知,或不是编译时常量。
1048 方法不能用作构造函数。
1049 对指定为常量的变量的赋值非法。
1050 不能赋给非引用值。
1051 返回值必须是 undefined。
1052 常量的初始值未知,或不是编译时常量。
1053 存取器类型必须匹配。
1054 setter 定义的返回类型必须是 unspecified 或 void。
1058 属性是只写的。
1059 属性是只读的。 此属性通过 getter 函数定义,因此,可以检索该属性的值。
1061 调用可能未定义的方法 _(通过静态类型为 _ 的引用来调用)。 所要调用的方法未定义。
1063 无法打开文件 _。
1064 元数据无效。 无法识别此元数据。
1065 元数据的属性不能包含多个元素。
1067 将 _ 类型的值隐式强制为无关 _ 类型。
1068 无法打开包含的文件 _。
1069 语法错误:应有定义或指令。 Check the syntax in the line.
1071 语法错误:定义关键字(如 function)应在属性 _ 之后,而不是 _ 之后。
1072 语法错误:命名空间之前应有 xml。 正确的语句语法是 default xml namespace = ns。
1073 语法错误:应有 catch 或 finally 子句。
1075 语法错误:如果没有“in”运算符,则不允许使用“each”关键字。
1076 语法错误:标识符之前应有左括号。
1077 应有 CaseLabel。 在 switch 块中,编译器此时应该执行 case 语句。
1078 标签必须是一个简单的标识符。
1079 super 表达式必须具有一个操作数。
1080 应有递增或递减运算符。
1082 括号内应有一个表达式。
1083 语法错误:遇到意外的 _。 代码行缺少某些信息。在下面的示例中,最后一个加号的后面必须带有某个表达式。
1084 语法错误:应有 _(_ 之前)。 此处不需要该表达式。
1086 语法错误:_ 之前应有分号。
1087 语法错误:程序结束之后找到额外的字符。
1093 语法错误。
1094 语法错误:字符串文字必须在换行符之前终止。
1095 语法错误:字符串文字必须在换行符之前终止。
1097 语法错误:输入已在到达字符串文字的右引号之前结束。
1099 语法错误。
1100 语法错误:XML 没有匹配的开始和结束标签。
1102 不能删除超级后代。
1103 命名空间的定义重复。 已多次定义该命名空间。请删除或修改重复的定义。
1105 赋值的目标必须是引用值。 可以给变量赋值,但是不能将一个值赋给另外一个值。
1106 递增操作数必须是引用。 操作数必须是变量、数组中的元素或对象的属性。
1107 递增操作数无效。 操作数必须是变量、数组中的元素或对象的属性。
1108 递减操作数无效。 操作数必须是变量、数组中的元素或对象的属性。
1109 应有表达式。 代码的一部分缺少表达式。例如,下面的代码会生成此错误(if 语句中缺少某项条件):
1110 缺少 XML 标签名称。
1112 可能会出现无限递归问题,因为此文件包含 _。
1113 在 _ 中检测到循环类型引用。 类正在尝试扩展超类。
1114 public 属性只能在包的内部使用。
1115 internal 属性只能在包的内部使用。
1116 用户定义的命名空间属性只能在顶级的类定义中使用。
1118 将静态类型为 _ 的值隐式强制为可能无关的类型 _。
1119 访问可能未定义的属性 _(通过静态类型为 _ 的引用来访问)。
1121 getter 定义不能包含参数。
1122 setter 定义只能包含一个参数。
1123 setter 定义不能包含可选参数。
1124 getter 定义的返回类型不能为 void。 getter 函数模拟变量。
1125 接口中定义的方法不能包含方法体。
1126 函数没有函数体。
1127 已多次指定属性 _。 在同一语句中多次指定了某个属性。
1129 接口的定义 _ 重复。 请更改或删除重复的定义。
1130 构造函数不能指定返回类型。
1131 不能嵌套类。
1132 final 属性只能在类中定义的方法内使用。
1133 native 属性只能与函数定义结合使用。
1134 dynamic 属性只能与类定义结合使用。
1135 语法错误:_ 不是有效类型。
1136 参数数目不正确。数目应为 _。 函数需要的参数数目与提供的参数数目不同。
1137 参数数目不正确。不应超过 _ 个。
1138 可选参数之后不允许有必需的参数。
1139 不允许在接口中声明变量。
1140 如果参数是在 ...rest 参数定义关键字之后指定的,则只能是 Array 数据类型。
1141 一个类只能扩展另外一个类,而不能扩展接口。
1142 一个接口只能扩展另外一个接口,但 _ 是一个类。 正在试图使用接口扩展类。
1143 override 属性只能在类中定义的方法内使用。
1144 接口方法 _(属于命名空间 _)使用类 _ 中不兼容的签名进行实现。
1145 Native 方法不能包含方法体。 不能使用 native,因为它是一个保留关键字。
1146 构造函数不能是 getter 或 setter 方法。
1147 未指定 AS 源文件。
1149 return 语句不能在静态初始化代码中使用。
1150 protected 属性只能在类的属性定义中使用。
1151 定义 _(属于命名空间 _)存在冲突。
1152 继承的定义 _(属于命名空间 _)存在冲突。
1153 只能将构造函数声明为公共函数。
1154 只能在定义中指定 public、private、protected 或 internal 之一。
1155 不能在其它函数的内部嵌套存取器。
1156 不能使用新运算符实例化接口。
1157 接口成员不能声明为 public、private、protected 或 internal。
1158 语法错误:函数体之前缺少左大括号 ({)。
1159 return 语句不能在包的初始化代码中使用。
1160 native 属性不能在接口定义中使用。 不能使用 native,因为它是一个保留关键字。
1162 每个定义中只能使用一个命名空间属性。
1163 方法 _ 与从接口 _ 继承的定义冲突。
1165 接口属性 _ 无效。
1166 Namespace declarations are not permitted in interfaces.
1167 类 _ 多次实现接口 _。 该类多次实现同一个接口。
1168 Illegal assignment to function _. 正在试图重新定义函数。
1169 不允许在接口方法中使用命名空间属性。
1170 函数没有返回值。 如果返回类型不是 void,函数中每个可能的控制流都必须返回值。
1171 命名空间初始值必须是文字字符串或其它命名空间。
1172 找不到定义 _。
1173 标签定义无效。
1176 将静态类型为 _ 的值与可能无关的类型 _ 进行了比较。 在严格模式下会生成此错误。
1177 return 语句不能在全局初始化代码中使用。
1178 尝试访问不可访问的属性 _(通过静态类型为 _ 的引用)。
1180 调用可能未定义的方法 _。 仅当编译器在严格模式下运行时,才会出现这种错误。
1181 转发对基类 _ 的引用。
1182 包不能用作值 _。
1184 使用了类型 _ 的不兼容默认值,但是应为 _。
1185 switch 包含多个默认值,但是只能使用一个默认值。
1188 对类 _ 的赋值非法。
1189 试图删除固定属性 _。只能删除动态定义的属性。 delete 会从对象中动态删除定义的属性。
1190 找不到基类,或基类不是编译时常量。
1191 找不到接口,或接口不是编译时常量。
1192 不允许在命名空间定义中使用 static 属性。
1193 不能在类或其它接口定义中嵌套接口定义。
1194 prototype 属性无效。
1195 试图访问不可访问的方法 _(通过静态类型为 _ 的引用)。
1196 语法错误:throw 之后应有表达式。
1197 类 _ 不能扩展 _,因为二者都与库符号或主时间轴关联。
1198 不允许在包的定义中使用属性。
1199 内部错误:_。
1200 语法错误:for-in 初始值无效,只能有 1 个表达式。
1201 this、super、return 或 throw 语句之后不能出现 super 语句。
1202 访问未定义的属性 _(属于包 _)。 正在试图访问包中未定义的变量。
1203 在基类 _ 中未找到默认构造函数。 如果有 1 个或多个必选参数,则必须使用 super() 语句显式调用基类的构造函数。
1204 /* 无对应匹配项 */ . 发现了指示注释开始位置的字符“/*”,但未发现指示注释块结束位置的对应字符“*/”。
❸ C++中逻辑错误、语法错误、编译错误分别出现什么情况
编译错误:
(1)警告:可运行,但结果有可能不正确
(2)错误:无法生成可执行文件
语法错误:无法生成可执行文件
逻辑错误:可运行,但结果很可能错误
❹ c++中什么是语法错误,什么是编译错误
程序的错误主要分成三种:
编译链接错误;
编译链接错误又分成编译错和链接错。
编译错就是普通意义上的语法错,编译器进行语法检查不通过,也就是程序违背了计算机语言的语法,例如:括号不匹配、变量名拼写错误、用保留字定义变量名等;
链接错是指程序通过了语法检查,但是无法生成可执行文件,最常见的是链接找不到lib库。初学者有时写了函数的声明,但是缺少函数的定义,此时就会出现链接错。
运行错误;
运行错是程序可以执行,但是在执行过程中发生异常,提前退出程序。最常见的是指针越界,打开文件失败继续读取文件,总而言之是让计算机执行一些不能执行的语句。
逻辑错误
逻辑错是程序也能运行,就是结果不对,主要原因有:程序算法本身错误,程序和算法不同义等。
例如:新手经常将判断相等的==写成=赋值,往往就会导致逻辑错。
你的BD(int,int); 是一句函数调用?还是一句函数声明?
❺ 这是属于哪种语法错误
在计算机科学中,语法错误是指程序的语法有误,编译器或解译器在词法分析时无法将其转换为适当的编程语言。 在编译语言中,语法错误一定只在编译期时出现,编译器要所有的语法都正确,才能正确编译。
❻ C语言 error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
count声明位置错了,纯c中声明变量全部放在main函数里,最前面的位置,要么vc6.0会报错。
修改:
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言是一门面向过程的计算机编程语言,与C++,java等面向对象的编程语言有所不同。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
❼ 什么是编译器
编译器
编译器是一种特殊的程序,它可以把以特定编程语言写成的程序变为机器可以运行的机器码。我们把一个程序写好,这时我们利用的环境是文本编辑器。这时我程序把程序称为源程序。在此以后程序员可以运行相应的编译器,通过指定需要编译的文件的名称就可以把相应的源文件(通过一个复杂的过程)转化为机器码了。
[编辑]编译器工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。最后生成的是目标文件,我们也称为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),如何合并几句代码成一句等等。
❽ 计算机syntax error什么意思
计算机syntax error有如下意思:
1、syntax error 通常表示语法错误。是指在编译器或解译器在词法分析时无法交其转换为适当的程式语言错误。
2、在C/C++中指语句的格式不对。
3、在java语言在myeclipse下做开发,错误原因可能是该脚本语言所用的语言编码不对。
(8)语法分析错误类型编译器扩展阅读:
错误产生原因如下:
语法错误是因为源程序中不正确的代码产生的,即在编写程序时没有遵守语法(或词法)规则,书写了错误的语法代码,从而导致编译器无法正确解释源代码而产生的错误。
其通常是由于录入的错误引起的,它在词法分析或语法分析时检测出来。如“非法字符”、“括号不匹配”、“缺少;”之类的错误。
❾ 错误类型: Microsoft VBScript 编译器错误 (0x800A03EA) 语法错误 /asp/conn.asp, line 5, column 130
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;User Id=e269net;jet OleDB:Database Password=e269net;Data Source=" & server.MapPath("/huiyuan/database/db.mdb")
路径里面不要加&,并且确定路径是否正确.