java詞法分析完整代碼 詞法分析 代碼

我要做個(gè)JAVA詞法分析工具,求JAVA的所有關(guān)鍵字和操作符

我有Java API里面有所有的接口和類,以及類里的方法

成都網(wǎng)站建設(shè)、成都做網(wǎng)站,成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向上千企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。

賦值操作符:

= 賦值符號(hào)。

+= 加等賦值。

-= 減等賦值。

*= 乘等賦值。

/= 除等賦值。

運(yùn)算操作符:

+ 加運(yùn)算符

- 減運(yùn)算符

* 乘運(yùn)算符

/ 除運(yùn)算符

% 求余運(yùn)算符

++ 自增1運(yùn)算符

-- 自減1運(yùn)算符

關(guān)系操作符:

小于。

= 小于或者等于。

大于。

= 大于或者等于。

== 等于。

!= 不等于(大于或小于)。

邏輯操作符:

?: if-then-else

邏輯與。位操作符。將左右表達(dá)式按二進(jìn)制按位進(jìn)行與操作(同位均為1則該位為1,否則為0)。

與操作。

| 邏輯或。

|| 或操作。

^ XOR。

== 等于

!= 不等于

! 邏輯非操作。

Abstract 抽象的

一個(gè)Java語(yǔ)言中的關(guān)鍵字,用在類的聲明中來(lái)指明一個(gè)類是不能被實(shí)例化的,但是可以被其它類繼承。一個(gè)抽象類可以使用抽象方法,抽象方法不需要實(shí)現(xiàn),但是需要在子類中被實(shí)現(xiàn)

break

一個(gè)Java的關(guān)鍵字,用來(lái)改變程序執(zhí)行流程,立刻從當(dāng)前語(yǔ)句的下一句開(kāi)始執(zhí)行從。如果后面跟有一個(gè)標(biāo)簽,則從標(biāo)簽對(duì)應(yīng)的地方開(kāi)始執(zhí)行

case

Java語(yǔ)言的關(guān)鍵字,用來(lái)定義一組分支選擇,如果某個(gè)值和switch中給出的值一樣,就會(huì)從該分支開(kāi)始執(zhí)行。

catch

Java的一個(gè)關(guān)鍵字,用來(lái)聲明當(dāng)try語(yǔ)句塊中發(fā)生運(yùn)行時(shí)錯(cuò)誤或非運(yùn)行時(shí)異常時(shí)運(yùn)行的一個(gè)塊。

char

Java語(yǔ)言的一個(gè)關(guān)鍵字,用來(lái)定義一個(gè)字符類型

continue

一個(gè)Java的關(guān)鍵字,用來(lái)打斷當(dāng)前循環(huán)過(guò)程,從當(dāng)前循環(huán)的最后重新開(kāi)始執(zhí)行,如果后面跟有一個(gè)標(biāo)簽,則從標(biāo)簽對(duì)應(yīng)的地方開(kāi)始執(zhí)行。

do

一個(gè)Java語(yǔ)言的關(guān)鍵字,用來(lái)聲明一個(gè)循環(huán),這個(gè)循環(huán)的結(jié)束條件可以通過(guò)while關(guān)鍵字設(shè)置

double

一個(gè)Java語(yǔ)言的關(guān)鍵字,用來(lái)定義一個(gè)double類型的變量

else

一個(gè)Java語(yǔ)言的關(guān)鍵字,如果if語(yǔ)句的條件不滿足就會(huì)執(zhí)行該語(yǔ)句。

final

一個(gè)Java語(yǔ)言的關(guān)鍵字。你只能定義一個(gè)實(shí)體一次,以后不能改變它或繼承它。更嚴(yán)格的講:一個(gè)final修飾的類不能被子類化,一個(gè)final修飾的方法不能被重寫(xiě),一個(gè)final修飾的變量不能改變其初始值。

finally

一個(gè)Java語(yǔ)言的關(guān)鍵字,用來(lái)執(zhí)行一段代碼不管在前面定義的try語(yǔ)句中是否有異?;蜻\(yùn)行時(shí)錯(cuò)誤發(fā)生。

float

一個(gè)Java語(yǔ)言的關(guān)鍵字,用來(lái)定義一個(gè)浮點(diǎn)數(shù)變量

for

一個(gè)Java語(yǔ)言的關(guān)鍵字,用來(lái)聲明一個(gè)循環(huán)。程序員可以指定要循環(huán)的語(yǔ)句,推出條件和初始化變量。

if

Java編程語(yǔ)言的一個(gè)關(guān)鍵字,用來(lái)生成一個(gè)條件測(cè)試,如果條件為真,就執(zhí)行if下的語(yǔ)句。

implements

Java(TM)編程語(yǔ)言的一個(gè)關(guān)鍵字,在類的聲明中是可選的,用來(lái)指明當(dāng)前類實(shí)現(xiàn)的接口。

import

Java(TM)編程語(yǔ)言的一個(gè)關(guān)鍵字,在源文件的開(kāi)始部分指明后面將要引用的一個(gè)類或整個(gè)包,這樣就不必在使用的時(shí)候加上包的名字。

instanceof

一個(gè)二操作數(shù)的Java(TM)語(yǔ)言關(guān)鍵字,用來(lái)測(cè)試第一個(gè)參數(shù)的運(yùn)行時(shí)類型是否和第二個(gè)參數(shù)兼容。

int

Java(TM)的一個(gè)關(guān)鍵字,用來(lái)定義一個(gè)整形變量

Java(TM)的一個(gè)關(guān)鍵字,用來(lái)定義一系列的方法和常量。它可以被類實(shí)現(xiàn),通過(guò)implements關(guān)鍵字。

long

Java語(yǔ)言的一個(gè)關(guān)鍵字,用來(lái)定義一個(gè)long類型的變量。

private

Java語(yǔ)言的一個(gè)關(guān)鍵字,用在方法或變量的聲中。它表示這個(gè)方法或變量只能被這個(gè)類的其它元素所訪問(wèn)。

protected

Java語(yǔ)言的一個(gè)關(guān)鍵字,在方法和變量的聲明中使用,它表示這個(gè)方法或變量只能被同一個(gè)類中的,子類中的或者同一個(gè)包中的類中的元素所訪問(wèn)。

public

Java語(yǔ)言的一個(gè)關(guān)鍵字,在方法和變量的聲明中使用,它表示這個(gè)方法或變量能夠被其它類中的元素訪問(wèn)。

return

Java語(yǔ)言的一個(gè)關(guān)鍵字,用來(lái)結(jié)束一個(gè)方法的執(zhí)行。它后面可以跟一個(gè)方法聲明中要求的值。

short

Java語(yǔ)言的關(guān)鍵字,用來(lái)定義一個(gè)short類型的變量。

static

Java語(yǔ)言的關(guān)鍵字,用來(lái)定義一個(gè)變量為類變量。類只維護(hù)一個(gè)類變量的拷貝,不管該類當(dāng)前有多少個(gè)實(shí)例。"static" 同樣能夠用來(lái)定義一個(gè)方法為類方法。類方法通過(guò)類名調(diào)用而不是特定的實(shí)例,并且只能操作類變量。

this

Java語(yǔ)言的關(guān)鍵字,用來(lái)代表它出現(xiàn)的類的一個(gè)實(shí)例。this可以用來(lái)訪問(wèn)類變量和類方法。

throw

Java語(yǔ)言的關(guān)鍵字,允許用戶拋出一個(gè)exception對(duì)象或者任何實(shí)現(xiàn)throwable的對(duì)象

throws

Java語(yǔ)言的關(guān)鍵字,用在方法的聲明中來(lái)說(shuō)明哪些異常這個(gè)方法是不處理的,而是提交到程序的更高一層。

transient

Java語(yǔ)言的關(guān)鍵字,用來(lái)表示一個(gè)域不是該對(duì)象串行化的一部分。當(dāng)一個(gè)對(duì)象被串行化的時(shí)候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進(jìn)去的。

try

Java語(yǔ)言的關(guān)鍵字,用來(lái)定義一個(gè)可能拋出異常語(yǔ)句塊。如果一個(gè)異常被拋出,一個(gè)可選的catch語(yǔ)句塊會(huì)處理try語(yǔ)句塊中拋出的異常。同時(shí),一個(gè)finally語(yǔ)句塊會(huì)被執(zhí)行,無(wú)論一個(gè)異常是否被拋出。

void

Java語(yǔ)言的關(guān)鍵字,用在Java語(yǔ)言的方法聲明中說(shuō)明這個(gè)方法沒(méi)有任何返回值。"void"也可以用來(lái)表示一句沒(méi)有任何功能的語(yǔ)句。

volatile

Java語(yǔ)言的關(guān)鍵字,用在變量的聲明中表示這個(gè)變量是被同時(shí)運(yùn)行的幾個(gè)線程異步修改的。

while

Java語(yǔ)言的一個(gè)關(guān)鍵字,用來(lái)定義一段反復(fù)執(zhí)行的循環(huán)語(yǔ)句。循環(huán)的退出條件是while語(yǔ)句的一部分。

關(guān)于break和continue。

continue語(yǔ)句與break語(yǔ)句相關(guān),但較少用到。continue語(yǔ)句用于使其所在的for、while或do-while語(yǔ)句開(kāi)始下一次循環(huán)。在while與do-while語(yǔ)句中,continue語(yǔ)句的執(zhí)行意味著立即執(zhí)行測(cè)試部分;在for循環(huán)語(yǔ)句中,continue語(yǔ)句的執(zhí)行則意味著使控制傳遞到增量部分。

Java沒(méi)有關(guān)鍵字default,如果class定義前什么也不寫(xiě)就是默認(rèn)型,說(shuō)明訪問(wèn)他的范圍是包內(nèi)

請(qǐng)用JAVA編程輸入一個(gè)語(yǔ)句進(jìn)行詞法分析

我最近正在學(xué)編譯原理,我有c語(yǔ)言實(shí)現(xiàn)的詞法分析程序,不知可不可以,識(shí)別的是TEST語(yǔ)言的單詞。

#includestdio.h

#includectype.h

#includestring.h

#define keywordSum 8

char * keyword[keywordSum] = {"do", "else", "for", "if", "int", "read", "while", "write"};

char singleword[50] = "+-*(){};,:";

char doubleword[10] = "=!|";

char Scanin[300], Scanout[300];

FILE * fin, * fout;

int binaryFind(int low, int high, char * c1, char ** c2) {

int mid;

if(low high) return -1;

mid = (low+high)/2;

if(strcmp(c1, c2[mid]) == 0) return mid;

else if(strcmp(c1, c2[mid]) 0) return binaryFind(mid+1, high, c1, c2);

else return binaryFind(low, mid-1, c1, c2);

}

int TESTscan() {

char ch, token[40];

int es = 0, j, n;

printf("請(qǐng)輸入源文件名(包括路徑):");

scanf("%s", Scanin);

printf("請(qǐng)輸入詞法分析輸出文件名(包括路徑):");

scanf("%s", Scanout);

if((fin=fopen(Scanin, "r")) == NULL) {

printf("\n打開(kāi)詞法分析輸入文件出錯(cuò)!\n");

return 1;

}

if((fout=fopen(Scanout, "w")) == NULL) {

printf("\n創(chuàng)建詞法分析輸出文件出錯(cuò)!\n");

return 2;

}

// printf("%c", getc(fin));

ch = getc(fin);

while(ch != EOF) {

while(ch==' ' || ch=='\n' || ch=='\t') {

ch = getc(fin);

}

if(isalpha(ch)) { //標(biāo)識(shí)符

token[0] = ch;

j = 1;

ch = getc(fin);

while(isalnum(ch)) { //判斷當(dāng)前字符是否是字母或數(shù)字

token[j++] = ch;

ch = getc(fin);

}

token[j] = '\0';

// printf("%s", token);

n = binaryFind(0, keywordSum-1, token, keyword);

if(n 0 ) {

fprintf(fout, "%s\t%s\n", "ID", token);

} else {

fprintf(fout, "%s\t%s\n", token, token);

}

} else if(isdigit(ch)) { //數(shù)字

token[0] = ch;

j = 1;

ch = getc(fin);

while(isdigit(ch)) {

token[j++] = ch;

ch = getc(fin);

}

token[j] = '\0';

fprintf(fout, "%s\t%s\n", "NUM", token);

} else if(strchr(singleword, ch) 0) { //singleword

token[0] = ch;

token[1] = '\0';

ch = getc(fin);

fprintf(fout, "%s\t%s\n", token, token);

} else if(strchr(doubleword, ch) 0) { //doubleword

token[0] = ch;

ch = getc(fin);

if(ch=='=' (token[0]==''||token[0]=='' || token[0] == '!')) {

token[1] = ch;

token[2] = '\0';

ch = getc(fin);

} else if((ch=='')||(ch=='|')||(ch=='=') ch==token[0]) {

token[1] = ch;

token[2] = '\0';

ch = getc(fin);

} else {

token[1] = '\0';

}

fprintf(fout, "%s\t%s\n", token, token);

} else if(ch == '/') { //注釋

ch = getc(fin);

if(ch == '*') {

char ch1;

ch1 = getc(fin);

do {

ch = ch1;

ch1 = getc(fin);

} while((ch!='*'||ch1!='/') ch1!=EOF);

ch = getc(fin);

} else {

token[0] = '/';

token[1] = '\0';

fprintf(fout, "%s\t%s\n", token, token);

}

} else {

token[0] = ch;

token[1] = '\0';

ch = getc(fin);

es = 3;

fprintf(fout, "%s\t%s\n", "ERROR", token);

}

}

fclose(fin);

fclose(fout);

return es;

}

void main() {

int es = 0;

es = TESTscan();

if(es 0) {

printf("詞法分析有錯(cuò), 編譯停止!\n");

} else {

printf("詞法分析成功!\n");

}

}

Java代碼到底是如何編譯成機(jī)器指令的

編譯器把一種語(yǔ)言規(guī)范轉(zhuǎn)化為另一種語(yǔ)言規(guī)范的這個(gè)過(guò)程需要哪些步驟?回答這個(gè)問(wèn)題需要參照《編譯原理》,總結(jié)過(guò)程如下:

1)詞法分析:讀取源代碼,一個(gè)字節(jié)一個(gè)字節(jié)的讀進(jìn)來(lái),找出這些詞法中我們定義的語(yǔ)言關(guān)鍵詞如:if、else、while等,識(shí)別哪些if是合法的哪些是不合法的。這個(gè)步驟就是詞法分析過(guò)程。

詞法分析的結(jié)果:就是從源代碼中找出了一些規(guī)范化的token流,就像人類語(yǔ)言中,給你一句話你要分辨出哪些是一個(gè)詞語(yǔ),哪些是標(biāo)點(diǎn)符號(hào),哪些是動(dòng)詞,哪些是名詞。

2)語(yǔ)法分析:就是對(duì)詞法分析中得到的token流進(jìn)行語(yǔ)法分析,這一步就是檢查這些關(guān)鍵詞組合在一起是不是符合Java語(yǔ)言規(guī)范。如if的后面是不是緊跟著一個(gè)布爾型判斷表達(dá)式。

語(yǔ)法分析的結(jié)果:就是形成一個(gè)符合Java語(yǔ)言規(guī)定的抽象語(yǔ)法樹(shù),抽象語(yǔ)法樹(shù)是一個(gè)結(jié)構(gòu)化的語(yǔ)法表達(dá)形式,它的作用是把語(yǔ)言的主要詞法用一個(gè)結(jié)構(gòu)化的形式組織在一起。這棵語(yǔ)法樹(shù)可以被后面按照新的規(guī)則再重新組織。

3)語(yǔ)義分析:語(yǔ)法分析完成之后也就不存在語(yǔ)法問(wèn)題了,語(yǔ)義分析的主要工作就是把一些難懂的,復(fù)雜的語(yǔ)法轉(zhuǎn)化成更簡(jiǎn)單的語(yǔ)法。就如難懂的文言文轉(zhuǎn)化為大家都懂的百話文,或者是注釋一下一些不懂的成語(yǔ)。

語(yǔ)義分析結(jié)果:就是將復(fù)雜的語(yǔ)法轉(zhuǎn)化為簡(jiǎn)單的語(yǔ)法,對(duì)應(yīng)到Java就是將foreach轉(zhuǎn)化為for循環(huán),還有一些注釋等。最后生成一棵抽象的語(yǔ)法樹(shù),這棵語(yǔ)法樹(shù)也就更接近目標(biāo)語(yǔ)言的語(yǔ)法規(guī)則。

4)字節(jié)碼生成:將會(huì)根據(jù)經(jīng)過(guò)注釋的抽象語(yǔ)法樹(shù)生成字節(jié)碼,也就是將一個(gè)數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為另外一個(gè)數(shù)據(jù)結(jié)構(gòu)。就像將所有的中文詞語(yǔ)翻譯成英文單詞后按照英文語(yǔ)法組裝文英文語(yǔ)句。代碼生成器的結(jié)果就是生成符合java虛擬機(jī)規(guī)范的字節(jié)碼。

標(biāo)題名稱:java詞法分析完整代碼 詞法分析 代碼
文章轉(zhuǎn)載:http://muchs.cn/article14/ddiepge.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)定制開(kāi)發(fā)、搜索引擎優(yōu)化、外貿(mào)建站、網(wǎng)站維護(hù)網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)