❶ 編譯器的組成及各部分的功能及作用
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")
路徑裡面不要加&,並且確定路徑是否正確.