編譯器語法檢測
⑴ 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++中什麼是語法錯誤,什麼是編譯錯誤
程序的錯誤主要分成三種:
編譯鏈接錯誤;
編譯鏈接錯誤又分成編譯錯和鏈接錯。
編譯錯就是普通意義上的語法錯,編譯器進行語法檢查不通過,也就是程序違背了計算機語言的語法,例如:括弧不匹配、變數名拼寫錯誤、用保留字定義變數名等;
鏈接錯是指程序通過了語法檢查,但是無法生成可執行文件,最常見的是鏈接找不到lib庫。初學者有時寫了函數的聲明,但是缺少函數的定義,此時就會出現鏈接錯。
運行錯誤;
運行錯是程序可以執行,但是在執行過程中發生異常,提前退出程序。最常見的是指針越界,打開文件失敗繼續讀取文件,總而言之是讓計算機執行一些不能執行的語句。
邏輯錯誤
邏輯錯是程序也能運行,就是結果不對,主要原因有:程序演算法本身錯誤,程序和演算法不同義等。
例如:新手經常將判斷相等的==寫成=賦值,往往就會導致邏輯錯。
你的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行。我們不需要自己去數行數,只需要雙擊這個錯誤就能到達對應的行。
⑺ 計算機編譯系統對宏定義在編譯時進行語法檢查這句話為什麼錯
第一步被換為area=a*b。
宏定義末尾不加分號,減少輸入錯誤和便於修改。宏替換在編譯前進行,不做表達式求解函數調用在編譯後程序運行時進行,只佔編譯時間。除了一般的字元串替換,函數調用不會。
宏展開不佔運行時間,不分配內存。
宏的啞實結合不存在類型,作用域為其後的程序,還要做參數代換。
格式:數組大小常用宏定義。
預處理是在編譯之前的處理。
宏定義又稱為宏代換; ",利用宏則可以設法得到多個值。
宏展開使源程序變長。
函數只有一個返回值,預處理不做語法檢查。一切以換為前提,准確理解之前就「換」;宏"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,會判斷是否符合文法規范
然後就是四元式,語義動作、匯編指令,後面的檢查應該就不多了