当前位置:首页 » 编程软件 » 编译器语法检测

编译器语法检测

发布时间: 2022-05-03 11:51:09

⑴ IDLE编辑器怎么运行pyflakes给python做语法检查

pyflakes有三种使用方法,第一种是当作命令行工具使用。第二种可以作为vim的插件,在vim编辑器中使用,实现所见即所得。第三种是可以在emacs中使用。
pyflakes作为命令行工具

安装pyflakes这个程序很简单。可以在pyflakes的官网这个网站进行下载:
http://pypi.python.org/pypi/pyflakes

这是一个命令行工具。在linux下,可以直接运行 ‘pyflakes 文件名’ 对文件进行语法检查。

在vim编辑器中使用pyflakes

首先要确保vim支持python2.5以上版本,如果不确定是否支持,请在vim中运行命令。
<!-- lang: shell -->
:version

结果例如:

+代表支持的功能,-代表不支持的功能。由于上图所示的vim不支持python, 所以需要重新编译vim。

要编译支持python2.5以上版本的vim, 第一要具有python2.5以上版本。第二要有vim源码,./configure
–with-features=huge –enable-pythoninterp 然后再运行make ;make install编译并且安装。

确定vim支持python2.5以上版本的方法为,在vim中运行“:python import sys; print sys.version”

在vim支持了Python之后,直接下载[pyflakes.vim]
3 http://www.vim.org/scripts/script.php?script_id=2441

将下载的压缩包,放在$HOME/.vim/下解压。在$HOME/.vim/ftplugin/python/下会增加一个pyflakes目录和pyflakes.vim文件。

然后在.vimrc文件中增加”filetype plugin indent on“。即可实现在vim编辑器中检查python语法的功能。

emacs支持

emacs可以通过flymake支持pyflakes。首先要安装命令行模式的pyflakes, 然后将下面的代码加入$HOME/.emacs
<!-- lang: cpp -->
(autoload 'flymake-find-file-hook "flymake" "" t)
(add-hook 'find-file-hook 'flymake-find-file-hook)
(setq flymake-gui-warnings-enabled nil)
(setq flymake-log-level 0)
(when (load "flymake" t)
(
defun flymake-pycheckers-init ()
(
let*
(
(
temp-file
(
flymake-init-create-temp-buffer-
'flymake-create-temp-inplace
)
)
(
local-file
(
file-relative-name
temp-file
(
file-name-directory buffer-file-name
)
)
)
)
(
list "pyflakes" (list local-file)
)
)

(add-to-list 'flymake-allowed-file-name-masks
'("\\.py\\'" flymake-pycheckers-init))
)
)

然后在emacs界面中可以显示python语法错误的地方。

⑵ 编译如何实现“括号配对检查”

任何语言都有语法的描述,语法的描述包括了括号的匹配定义。
编译器检查程序是否符合语法,就能检测出括号不匹配的情况。

语法检测是很复杂的东西,详细的请去参阅编译原理关于语法检查的章节。
关键字:syntax parsing

⑶ 用eclipse 编写java代码时,他为什么能自动识别语法错误及给出正确的写法这是JAVA编译器的哪种特性

这是靠eclipse自带的插件实现的,的确属于静态分析。动态分析我不太了解,可能会涉及到jvm,但主要是在编译器内获取一些动态信息,如果想对java的多态进行分析就需要动态分析,即在编译时获取具体调用的类的信息。但如果是问eclipse的语法纠错,远没涉及那么高级的内容。
如果你去看eclipse文件夹下的plugins文件夹,你能找到类似org.eclipse.jdt.XXX.XXX的若干jar文件,那些包就是eclipse专门用以处理java代码分析工作的jdt插件工具包。他能抽取java代码的AST(抽象语法树),也就是编译时用到的数据结构,你若学过编译原理就知道了,反正我还没学。如果做一些java方面的逆向工程,你甚至可以引用eclipse的jdt包,将java项目的代码通过相应接口(你可以在网上找到jdt的api和实例代码)传进去,获取代码中的类,字段,方法,和更细节的信息。
而jdt中也包含检测,处理语法错误的包,可以发现并纠正语法错误。这一特点还可以用来做一些正向工程(如自修改或动生成代码)。
哦,还有,针对你的问题还要说,这点特性不是编译器的,而是编辑器eclipse的。注意,绝对是编辑器的特点!虽然涉及到语法问题,但在eclipse纠错时,还没有调用编辑器,即程序还没有编辑。只有在运行程序前eclipse才会调用编辑器。编译一次不容易,每次纠错都调用编译器的话开销太大,纠错的反应速度绝对不会像平时eclipse做的那么快。
实际上eclipse可以说就是由各种插件组成的,它本身只提供一个供各种插件运行的平台,本身功能很简单,但就是通过向jdt这样的插件包实现各种复杂的功能。

⑷ c++中什么是语法错误,什么是编译错误

程序的错误主要分成三种:

  1. 编译链接错误;

    编译链接错误又分成编译错和链接错。

    编译错就是普通意义上的语法错,编译器进行语法检查不通过,也就是程序违背了计算机语言的语法,例如:括号不匹配、变量名拼写错误、用保留字定义变量名等;

    链接错是指程序通过了语法检查,但是无法生成可执行文件,最常见的是链接找不到lib库。初学者有时写了函数的声明,但是缺少函数的定义,此时就会出现链接错。

  2. 运行错误;

    运行错是程序可以执行,但是在执行过程中发生异常,提前退出程序。最常见的是指针越界,打开文件失败继续读取文件,总而言之是让计算机执行一些不能执行的语句。

  3. 逻辑错误

    逻辑错是程序也能运行,就是结果不对,主要原因有:程序算法本身错误,程序和算法不同义等。

    例如:新手经常将判断相等的==写成=赋值,往往就会导致逻辑错。

你的BD(int,int); 是一句函数调用?还是一句函数声明?

⑸ 在寄存器版本编程中sys.c文件中,语法检测已报错了,但是编译却说0 Error(s), 0 Warning(s).为什么

语法检测只联系上下文且外部函数在诞生时就已经写好了,编译器可以实时更改。比如一个自己写的头文件引用进来,用这个头文件里的一个函数,语法检测报错但编译器可以找到这个头文件里的函数,所以编译器不报错

⑹ dev c怎么随时检查语法

语法错误是指在书写语句时没有按照相应的语法格式。常见的语法错误有变量未定义、括号不匹配、遗漏了分号等等。大多数的语法错误都是能够被编译器发现的。因此相比于语意错误,语法错误更容易被发现,更容易被解决。

语法检查的工作由编译器完成,很多情况下编译器无法智能地报告出真正的语法错误数和错误位置。比如缺少一个变量的定义,而该变量在程序中被使用了6次,则编译器可能会报告6个甚至更多的语法错误,而实际上错误只有一个。所以,对编译器来说,任何一个语法错误都可能是“牵一发而动全身”的。

那么在这种可能发生“误报”的情况下,我们如何快速、正确地找到错误的位置呢?

由于编译器是按顺序查找语法错误的,所以它所找到的第一个错误的位置往往是正确的。如果程序规模不大,编译一次的时间不是很长,我们可以每次只修正编译器报告的第一个错误以及由此可以发现的连带错误,直到整个程序没有任何错误为止。

下面我们就用这种方法来检查一个程序的语法错误:(程序11.3.1)
#include <iostream>
mian()
{
int a,b;
for (i=0,i<3,i++)
{
cin >>a >>b;
c=a+b;
cout <<c <<endl;
}
return 0;
}
第一次编译的第一个错误:
I:programvcook11_3_1main.cpp(5) : error C2065: 'i' : undeclared identifier//未声明的标识符
……
main.obj - 7 error(s), 3 warning(s)//一共还有7个错误和3个警告

第一次修改:
for (int i=0,i<3,i++)
第二次编译的第一个错误:
I:programvcook11_3_1main.cpp(5) : error C2143: syntax error : missing ',' before '<'//逗号语法错误
……
main.obj - 8 error(s), 3 warning(s) //一共还有8个错误和3个警告

第二次修改:
for (int i=0;i<3;i++)
第三次编译的第一个错误:
I:programvcook11_3_1main.cpp(7) : error C2065: 'cin' : undeclared identifier//未声明的标识符
……
main.obj - 4 error(s), 3 warning(s) //一共还有4个错误和3个警告

第三次修改:
添加using namespace std;
第四次编译的第一个错误:
I:programvcook11_3_1main.cpp(9) : error C2065: 'c' : undeclared identifier//未声明的标识符
……
main.obj - 1 error(s), 1 warning(s)//一共还有1个错误和1个警告
第四次修改:
int c=a+b;
第五次编译的第一个错误:
I:programvcook11_3_1main.cpp(12) : warning C4508: 'mian' : function should return a value; 'void' return type assumed//函数需要返回一个值
……
main.obj - 0 error(s), 1 warning(s) //一共还有1个警告

第五次修改:
int mian()
第六次编译:
main.obj - 0 error(s), 0 warning(s)//编译正确
第一次连接的第一个错误:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main//没有main函数
……
11_3_1.exe - 2 error(s), 0 warning(s)//一共还有2个错误

第六次修改:
int main()
第七次编译:
main.obj - 0 error(s), 0 warning(s)//编译正确
第二次连接:
11_3_1.exe - 0 error(s), 0 warning(s)//连接正确

完整的程序:
#include <iostream>
using namespace std;
int main()
{
int a,b;
for (int i=0;i<3;i++)
{
cin >>a >>b;
int c=a+b;
cout <<c <<endl;
}
return 0;
}

至此,整个程序的所有语法错误都被检查出来并且被修正。程序编译阶段没有任何错误了。通过对这个程序的语法检查,我们总结出以下几点:

  • 编译器所报告的第一个错误位置往往是有效的,但是报告的错误内容未必正确。比如第二次编译时报告的错误是“在小于号之前缺少了逗号”,而事实上问题是for语句中应该使用分号。所以,报告的错误内容只能参考,却不能完全相信。

  • 编译器报告的错误数目与实际错误数目未必符合。甚至第一次改正一个错误后,错误数反而增加了。所以,报告的错误数目不能正确描述实际的错误规模。

  • 编译器报告的警告也应当被重视。有些人认为即使程序存在警告,但是它能正常执行,所以警告可以被忽视。这种想法是错误的。如果一个程序是完美的,为什么编译器还要给出警告呢?警告的存在就说明了这个程序有些地方还不符合正确的语法。

  • I:programvcook11_3_1main.cpp(5)括号中的5表示错误在程序的第5行。我们不需要自己去数行数,只需要双击这个错误就能到达对应的行。

⑺ 计算机编译系统对宏定义在编译时进行语法检查这句话为什么错

  1. 第一步被换为area=a*b。
    宏定义末尾不加分号,减少输入错误和便于修改。宏替换在编译前进行,不做表达式求解函数调用在编译后程序运行时进行,只占编译时间。

  2. 除了一般的字符串替换,函数调用不会。

  3. 宏展开不占运行时间,不分配内存。

  4. 宏的哑实结合不存在类型,作用域为其后的程序,还要做参数代换。

  5. 格式:数组大小常用宏定义。

  6. 预处理是在编译之前的处理。

  7. 宏定义又称为宏代换; ",利用宏则可以设法得到多个值。

  8. 宏展开使源程序变长。

  9. 函数只有一个返回值,预处理不做语法检查。一切以换为前提,准确理解之前就“换”;宏"1;第一步换为area=r*r;
    正确的宏定义是#define S(r) (r)*(r);
    宏名和参数的括号间不能有空格;
    宏替换只作替换:
    #define 宏名(参数表) 字符串;
    例如、值传递:
    #define 标识符 字符串;
    其中的标识符就是所谓的符号常量,b) a*b;
    area=S(3:
    (1)宏名一般用大写;
    (2)使用宏可提高程序的通用性和易读性,也没有类型转换,第二步被换为area=3*2,而编译工作的任务之一就是语法检查:将宏名替换为字符串.带参数的宏、做任何事情之前先要换,并且分配内存。
    预处理(预编译)工作也叫做宏展开;中永远不包含宏。
    (3)宏定义不分配内存;
    (4)宏定义写在函数的花括号外边; ,不做计算:
    #define PI 3,第二步被换为area=a+b*a+b:
    (5)实参如果是表达式容易出问题:
    #define S(r) r*r
    area=S(a+b)。
    即在对相关命令或语句的含义和功能作具体分析之前就要换;
    类似于函数调用。
    格式.1415926。
    把程序中出现的PI全部换成3。
    (6)可以用#undef命令终止宏定义的作用域。
    (7)宏定义可以嵌套。
    (8)字符串",变量定义分配内存,通常在文件的最开头。1415926说明,也称为“宏名”,简称“宏”、宏替换。

c语言编译器怎么检查错误的

C语言编译器有好多种
大同小异
有DEV-C++
VC6.0等
检查错误
都能检查
但只能检查出语法错误
不能检查出逻辑错误

⑼ c语言改错 怎么通过编译程序检查出语法错误

编译器编译时对你的代码错误自动显示出来,
告诉你错在哪里
你鼠标双击他的错误提示
就可以跳转到代码有错误的那一行了
编译器VC
Build里点击ReBuildAll
就保证可以编译了

⑽ gcc编译器在编译过程会进行哪些检查

一个编译器,执行的时候
先会做词法分析,其中会判断是否符合词法规范,一般用有限自动机写
然后是语法分析,自顶向下的LL和自底向上的LR,会判断是否符合文法规范
然后就是四元式,语义动作、汇编指令,后面的检查应该就不多了

热点内容
分布式缓存部署步骤 发布:2025-05-14 13:24:51 浏览:610
php获取上一月 发布:2025-05-14 13:22:52 浏览:89
购买云服务器并搭建自己网站 发布:2025-05-14 13:20:31 浏览:688
sqlserver建立视图 发布:2025-05-14 13:11:56 浏览:484
搭建httpsgit服务器搭建 发布:2025-05-14 13:09:47 浏览:255
新电脑拿回来我该怎么配置 发布:2025-05-14 13:09:45 浏览:240
视频服务器新建ftp用户 发布:2025-05-14 13:03:09 浏览:225
php花生 发布:2025-05-14 12:54:30 浏览:550
java人才 发布:2025-05-14 12:29:10 浏览:649
如何打开软密码 发布:2025-05-14 12:28:55 浏览:427