java語法分析
A. java該怎麼自學
在學java一定要問問自己喜歡嗎?只要喜歡一切沒問題,這是我的建議:多敲代碼,多敲代碼,多敲代碼,重要的事情說三遍
學習Java決不能聽完敲一遍就過,一定要多敲幾遍,第一遍可以跟著老師的思路,後面一定要有自己的思路,慢慢培養自己的編程思想和實現功能的邏輯。甚至可以自己給自己出題,完全靠自己實現一些有意思的小功能,對提升自己的能力和代碼熟練度都有不小的幫助。
多看視頻,多練習,主要是練習一些演算法的運用,建議下載一些編程練習題,一道一道弄通弄懂。經常做筆記,用記事本把一些經典問題保存下來,以備復習。
如果是零基礎的話,就看視頻,b站上高旗老師講得不錯,每看到視頻出現一段代碼就馬上在電腦上給他跑出來,不要直接拿源碼光碟來復制,不要把視頻看完半段了才開始敲代碼。這樣幾天後你會找到一些感覺,然後沒事就想些代碼來寫寫,比如想下怎樣把名字轉換成亂碼,然後再用另一個方法轉換回來,模擬步話機發送幾條消息什麼的。這樣下去不出3月你定牛逼,這時再把教材拿出來仔細看每一句話,掌握原理。
希望你早日學成,有苦惱一起討論一下。
B. java進行語法分析時已達到結尾 那位大佬知道錯在哪裡嗎
你的Java程序我幫你改好了,你看看吧.(改動的地方見注釋) package study;public class Fc { public static void main(String[] args) { char[][] a=new char[5][5];//這里new char[5][]改成new char[5][5],因為你沒有在後面定義每行的大小,所以在這里定義每行的大小 int x,y; for(x=0;x<=4;x++){ //這里for(x=0;x<=4;x++);後面多了一個分號;,所以數組越界 System.out.println(); for(y=0;y<=x;y++){//這里for(y=0;y<=x;y++);後面多了一個分號;,所以數組越界 a[x][y]='*'; System.out.print(a[x][y]); } } }}運行結果***************
C. java語義分析
public class VariableTypeResolver {
private final String symbol;
private final ASTNode minScope;
private boolean methodLevel = true;
private boolean typeLevel = true;
/**
* The found result
*/
private SimpleName declSN;
private final ASTVisitor visitor = new ASTVisitor() {
@Override
public boolean visit(SimpleName sn) {
if (found()) {
return false;
}
if (sn.getIdentifier().equals(symbol) && sn.getParent() instanceof VariableDeclaration) {
declSN = sn;
return false;
}
return true;
}
};
/**
* Starts resolving with the requested symbol
* @param varSymbolNode the variable symbol node to resolve (node must be in the AST)
*/
public VariableTypeResolver(SimpleName varSymbolNode) {
this.symbol = varSymbolNode.getIdentifier();
this.minScope = varSymbolNode;
}
public VariableTypeResolver(String varSymbol, ASTNode minScope) {
this.symbol = varSymbol;
this.minScope = minScope;
}
public VariableTypeResolver disableMethodLevel() {
methodLevel = false;
return this;
}
public VariableTypeResolver disableTypeLevel() {
typeLevel = false;
return this;
}
/**
* Node's parent is instance of {@link VariableDeclarationFragment} or {@link SingleVariableDeclaration}
* @return the SimpleName node of declaration
*/
public SimpleName resolveDeclSimpleName() {
if (!found()) {
resolve();
}
return declSN;
}
private void resolve() {
if(found()) {return;}
if (methodLevel) {
apply(FindUpper.methodScope(minScope));
}
if(found()) {return;}
if (typeLevel) {
AbstractTypeDeclaration typeScope = FindUpper.abstractTypeScope(minScope);
applyInFields(typeScope);
if(found()) {return;}
for (TypeDeclaration superClass : superClasses(typeScope)) {
if(found()) {return;}
applyInFields(superClass);
}
}
}
private boolean found() {
return declSN != null;
}
private void apply(ASTNode scope) {
if (scope == null) {
throw new NullPointerException();
}
scope.accept(visitor);
}
private void applyInFields(AbstractTypeDeclaration typeScope) {
for (Object bd : typeScope.bodyDeclarations()) {
if (bd instanceof FieldDeclaration) {
apply((ASTNode) bd);
}
}
}
private List<TypeDeclaration> superClasses(AbstractTypeDeclaration atd) {
if (atd instanceof TypeDeclaration) {
return AstUtils.superClasses((TypeDeclaration) atd);
}
else {
return Collections.EMPTY_LIST;
}
}
}
也是網上找的
D. java怎麼學
第一步:零基礎學習java的第一步,首先先學習,計算機基本原理,Java語言發展簡史,這些是最基本的常識,初學者一定要了解這些常識。
第二步:要了解java開發的環境搭建,體驗java程序員的開發環境,比如變數path和classpath的設置,java程序員的執行過程,java反編譯工具。
然後了解,計算機常用進制二、八、十六的介紹,以及它們與十進制之間的相互轉化,ASCII碼。
第三步:了解Java語法格式,常量和變數,變數的作用域,函數和函數的重載,運算符,程序流程式控制制,數組和操作數組的類。針對數組的常用查找、排序演算法原理,以及其Java實現。
第四步:學習一個很難理解的一個概念「對象」,很多人學到「對象」就會感到有些吃力,不過沒關系,只要根據小編工具里的教程來學習,肯定可以讓你很快掌握。對於新手小白想更輕松的學好Java提升,Java架構,web開發、大數據,數據分析,人工智慧等技術,這里給大家分享系統教學資源
這段時間,你要掌握的知識點如下:
對象的本質,理解面向對象,類與對象的關系,在程序中如何應用面向對象的思想解決問題。
如何設計類,設計類的基本原則,類的實例化過程,類的細節:構造函數、this關鍵字、方法和方法的參數傳遞過程、static關鍵字、內部類,Java的垃極回收機制,Javadoc介紹。
對象的三大特性:封裝、繼承和多態,以及相應的Java實現:子類對象的實例化過程、方法的覆蓋、final關鍵字、抽象類、介面、繼承的優點和缺點剖析。
E. JAVA你知道後端都要學習些什麼嗎
選擇學習Java,首先,我們要知道我們學習Java是為了什麼,要達到一個什麼樣的目標,對未來的職業要有一個具體詳細的計劃,我們在進行具體的學習訓練。在學習Java基礎的時候,會遇到很多的困難,關於Java基礎學習的每一個重要知識點,都要掌握,因為就業中越是大的公司越會在乎你對Java基礎的認知和理解,所以基礎無疑是最重要的,萬丈高樓平地起,基礎建設得好不好,將決定你後面所有建設的高度,Java也是一樣,基礎很重要,未來職業還很遠,但是能走多遠,取決於你對Java基礎知識的認識程度。所以基礎學習至關重要,如果你是真的想學好這門技術,想在這個行業取得成就,請你繼續往下看。
Java基礎語法:Java語法是就相當於英文中的26個字母,你需要將每個關鍵詞都學的很透徹,對於初學者來說,最困難的概念是基本結構,例如循環和分支。這部分沒有過多的技巧,多去做一些相關的練習題,熟能生巧。
面向對象編程(OOP):OOP嚴格意義上來說有兩個模塊,一是面向對象的思維,二是面向對象的編程語法。面向對象的思維這個理解起來有點難,因為我們在學Java的基礎語法時,習慣了用面向過程的思維去編程,轉變為面向對象時頭腦中會很混亂,即使老師舉很多實例去解釋 依舊會產生很多困惑,碰到這種情況不要著急,面向對象的思維需要長期去培養,同基礎語法一樣,思維也需要大量的實踐去培養。
面向對象涉及到的語法主要有:類、繼承、介面、多態、封裝,這是Java編程中另一個重要的組成部分,可以說在工作中,無論用哪種框架,哪種編輯器,面向對象的編程都是重中之重。這個模塊也是在面試中的重點,所以一定要掌握扎實!
集合框架:Java為不同的集合提供了一個集合框架。集合基於數據結構,比如常見的:列表、數組、集合、哈希圖等等。因此,在研究集合時,最好了解一點數據結構的相關知識。
學習集合的主要困難在於他們之間的區別,以及何時用到適合的集合類型。同樣的,也是必須實踐出真知。
異常處理:異常是在執行程序時可能發生的異常情況。很多人在學習的過程中理解不了異常的作用,在初學的時候也有相同的疑問,編輯器已經有報錯的功能了,為什麼還要自己去編寫一段處理異常的代碼。後來隨著項目使用的異常處理越來越多,對異常處理也會有深刻的了解。
舉個簡單的例子:當你下載文件時,如出現什麼錯誤,用戶希望下載器能告訴他出現了什麼問題,比如硬碟不足等等,當用戶提供了足夠的硬碟空間以後,下載繼續自動進行。而不是說空間一不足,立刻下載器就崩潰,這就是異常技術。
輸入/輸出流:Java使用流來執行輸入和輸出的操作。在項目中,需要經常進行讀寫操作。對於初學者來說,這也是一個比較困難的知識點,而且在Java的學習過程中,這一點的重要性並不是很突出,導致很多人在工作後碰到文件的讀寫操作就乾瞪眼了
Java多線程/並發:多線程和並發操作是Java高級編程的核心主題。這部分幾乎所有的同學都理解不了,不過沒有關系,這部分對於初級開發者來說不是很重要。可以在工作的過程中慢慢深入了解。為什麼要把這個模塊放在文章里,主要是目前市場上有些公司的面試會問及多線程並發的問題,為了Offer,推薦大家還是看看。
Lambda表達式:Java lambda表達式出現在Java 8中,這是一個經常被開發者忽略的工具。Lambda表達式是一個可以創建的函數,不屬於任何類,可作為對象傳遞或執行。
演算法和數據結構:每一門編程語言的學習過程中,最有爭議的問題之一就是每個學生是否應該學習標準的排序和搜索演算法。有的人認為,大部分演算法已經編寫在庫中,使用起來很方便。另一部分人認為,學習演算法的過程就是鍛煉編程思維的過程,一定要學習。
更傾向於後者的說法,因為經歷過很多面試,無論是自己去求職還是面試求職者,都會在面試過程中考察演算法和數據結構的相關問題。如果想要保證自己不被落選,這方面的知識還是多學習一點。
實用的庫和組件:庫和組件是能否勝任一份工作的重要指標,庫和組件能大大提升開發效率。所以公司在招聘時會特別注重這一點,面試時會詢問你的庫和組件的使用和學習經歷。
Spring/Hibernate:在以前,成為Java工程師有以上知識足矣,但是隨著近幾年技術的變更和開發者的急劇增長,開發者的門檻也逐漸增加,比如Spring/Hibernate,不會這兩門技術,很難找到工作。
上面就是成為一名Java開發者所需要的學習的知識,有些知識需要精通,比如基礎語法、OOP,集合框架,異常處理,流,實用的庫和組件,Spring框架等;有些只需要了解,能在面試中回答出來,給面試官留下一個好的印象,比如多線程/並發,Lambda表達式,演算法和數據結構。希望對小白能有幫助,也祝你的Java學習之路能夠順順利利。
F. java語法錯誤,進行分析時已經到達文件結尾
原因:
分析已達到文件結尾一般是括弧沒有閉合,或者缺少了分號
解決方案:
手工查看括弧閉合情況
使用帶自動對齊功能的編輯器如eclipse,notepad++
建議平時編程時多注意積累錯誤經驗,語法錯誤不應當耗費太多時間
拓展資料:
Java的組成:
Java編程語言
Java類文件格式
Java虛擬機
Java應用程序介面
當編輯並運行一個Java程序時,需要同時涉及到這四種方面。使用文字編輯軟體(例如記事本、寫字板、UltraEdit等)或集成開發環境(Eclipse、MyEclipse等)在Java源文件中定義不同的類 ,通過調用類(這些類實現了Java API)中的方法來訪問資源系統,
把源文件編譯生成一種二進制中間碼,存儲在class文件中,然後再通過運行與操作系統平台環境相對應的Java虛擬機來運行class文件,執行編譯產生的位元組碼,調用class文件中實現的方法來滿足程序的Java API調用
G. java初學者,應該如何學習java呢
初學Java編程時,大家通常會對學習方法、知識難點做一個了解,但學一項技能不僅僅只是這樣,學習過程少不了我們的親身參與,那我們對自己的學習條件了解是否充分?心理上思想上是否做好了准備?要准備學到哪種程度?···這些其實都是學習編程時需要注意到的。
學Java編程的目的?
知乎無數的優秀學習類回答、技術大佬的分享,在開頭的第一段都會提到的,是想清楚做某事的目的是什麼。千萬別覺得這樣很老套很無用,明確學習目的其實就是在做思想上的准備,不然在後期非常容易缺乏堅持下去的信念。
因為沒有描述,就假設題主同學學習Java是為了從事相關的開發工作,去發現一下真實的需求就能知道,「找工作」其實都是表象,真正的本質是「高薪」,是「掙錢」是「有發展」。那麼「薪資高」就是學編程的目的之一。
稍微多想想我們就會有接下來的問題:企業招聘的基本要求是哪些?需要達到什麼樣的技術水平薪資才高?薪資比較高的Java崗位是哪些?大公司都需要哪種技術人才?
問題比較多也沒關系,接下來就是一步步理清楚。
有沒有自己的學習目標?
學習目標圍繞學習目的而定,別太貪心什麼都想學,學不完的,太高深的概念對於初學者也是有毒的。
高薪資的崗位需要的技術能力都在Java的知識體系中了,我們從整體到局部開始,先了解Java的大致全貌--Java是用來做什麼的。
按Java的應用場景來分有三類:J2SE,J2ME和J2EE,這也就是SunONE(Open NetEnvironment)體系。
J2SE就是Java2的標准版,主要用於桌面應用軟體的編程;
J2ME主要應用於嵌入式系統開發,如手機和PDA 的編程;
J2EE是Java2的企業版,主要用於分布式的網路程序的開發,如電子商務網站,OA系統和ERP系統。接著是局部--比如其中涉及J2EE方向的是什麼崗位,需要會什麼?且薪資是多少?
在此場長還要補充兩句,對於程序員來說,學歷高低不是唯一標准,但絕對是加分項,能提升學歷就盡快提升,不要讓它在後期成為你職業發展的阻礙。
以上從「整體到局部」的好處是,不僅為你的學習找到重心,還是在定位你的技術重心,也將會成就你寫在簡歷中的那句「本人擅長XX開發,熟悉XXX技術,且精通XXXX,在XXX有豐富經驗。」
有沒有一個學習計劃?
有了學習目的,找到了一個高薪的技術方向和技術重點,有了這些信息,你就可以開始制定學習計劃了。
一個科學而合理的學習計劃,關鍵並不是面面俱到的詳細,而是「極高的可執行性」,要避免看到自己定的計劃就頭疼,無法完成這樣的情況,就要注意別一開始就把自己逼得太狠。
記得圍繞著學習目標開展學習,專注能保持高效率,這也能減少你的學習時長,還能保證學習效果。
最後,
編程講的是多多練習沒錯,但別忘了編程背後是思維,是邏輯,是解決問題的思路,希望在學編程的你,能把編程看成一種智力的游戲,在提升自己心智的同時,看到一個奇特而有趣的代碼世界。
祝編程愉快。
H. 怎麼用java寫一個詞法分析器
首先看下我們要分析的代碼段如下:
輸出結果(c).PNG
括弧里是一個二元式:(單詞類別編碼,單詞位置編號)
代碼如下:
?
1234567891011121314package Yue.LexicalAnalyzer;import java.io.*;/** 主程序*/public class Main {public static void main(String[] args) throws IOException {Lexer lexer = new Lexer();lexer.printToken();lexer.printSymbolsTable();}}?
package Yue.LexicalAnalyzer;import java.io.*;import java.util.*;/** 詞法分析並輸出*/public class Lexer {/*記錄行號*/public static int line = 1;/*存放最新讀入的字元*/char character = ' ';/*保留字*/Hashtable<String, KeyWord> keywords = new Hashtable<String, KeyWord>();/*token序列*/private ArrayList<Token> tokens = new ArrayList<Token>();/*符號表*/private ArrayList<Symbol> symtable = new ArrayList<Symbol>();/*讀取文件變數*/BufferedReader reader = null;/*保存當前是否讀取到了文件的結尾*/private Boolean isEnd = false;/* 是否讀取到文件的結尾 */public Boolean getReaderState() {return this.isEnd;}/*列印tokens序列*/public void printToken() throws IOException {FileWriter writer = new FileWriter("E:\lex.txt");System.out.println("詞法分析結果如下:");System.out.print("杜悅-2015220201031 ");writer.write("杜悅-2015220201031 ");while (getReaderState() == false) {Token tok = scan();String str = "line " + tok.line + " (" + tok.tag + "," + tok.pos + ") "+ tok.name + ": " + tok.toString() + " ";writer.write(str);System.out.print(str);}writer.flush();}/*列印符號表*/public void printSymbolsTable() throws IOException {FileWriter writer = new FileWriter("E:\symtab1.txt");System.out.print(" 符號表 ");System.out.print("編號 行號 名稱 ");writer.write("符號表 ");writer.write("編號 " + " 行號 " + " 名稱 ");Iterator<Symbol> e = symtable.iterator();while (e.hasNext()) {Symbol symbol = e.next();String desc = symbol.pos + " " + symbol.line + " " + symbol.toString();System.out.print(desc + " ");writer.write(desc + " ");}writer.flush();}/*列印錯誤*/public void printError(Token tok) throws IOException{FileWriter writer = new FileWriter("E:\error.txt");System.out.print(" 錯誤詞法如下: ");writer.write("錯誤詞法如下: ");String str = "line " + tok.line + " (" + tok.tag + "," + tok.pos + ") "+ tok.name + ": " + tok.toString() + " ";writer.write(str);}/*添加保留字*/void reserve(KeyWord w) {keywords.put(w.lexme, w);}public Lexer() {/*初始化讀取文件變數*/try {reader = new BufferedReader(new FileReader("E:\輸入.txt"));} catch (IOException e) {System.out.print(e);}/*添加保留字*/this.reserve(KeyWord.begin);this.reserve(KeyWord.end);this.reserve(KeyWord.integer);this.reserve(KeyWord.function);this.reserve(KeyWord.read);this.reserve(KeyWord.write);this.reserve(KeyWord.aIf);this.reserve(KeyWord.aThen);this.reserve(KeyWord.aElse);}/*按字元讀*/public void readch() throws IOException {character = (char) reader.read();if ((int) character == 0xffff) {this.isEnd = true;}}/*判斷是否匹配*/public Boolean readch(char ch) throws IOException {readch();if (this.character != ch) {return false;}this.character = ' ';return true;}/*數字的識別*/public Boolean isDigit() throws IOException {if (Character.isDigit(character)) {int value = 0;while (Character.isDigit(character)) {value = 10 * value + Character.digit(character, 10);readch();}Num n = new Num(value);n.line = line;tokens.add(n);return true;} elsereturn false;}/*保留字、標識符的識別*/public Boolean isLetter() throws IOException {if (Character.isLetter(character)) {StringBuffer sb = new StringBuffer();/*首先得到整個的一個分割*/while (Character.isLetterOrDigit(character)) {sb.append(character);readch();}/*判斷是保留字還是標識符*/String s = sb.toString();KeyWord w = keywords.get(s);/*如果是保留字的話,w不應該是空的*/if (w != null) {w.line = line;tokens.add(w);} else {/*否則就是標識符,此處多出記錄標識符編號的語句*/Symbol sy = new Symbol(s);Symbol mark = sy; //用於標記已存在標識符Boolean isRepeat = false;sy.line = line;for (Symbol i : symtable) {if (sy.toString().equals(i.toString())) {mark = i;isRepeat = true;}}if (!isRepeat) {sy.pos = symtable.size() + 1;symtable.add(sy);} else if (isRepeat) {sy.pos = mark.pos;}tokens.add(sy);}return true;} elsereturn false;}/*符號的識別*/public Boolean isSign() throws IOException {switch (character) {case '#':readch();AllEnd.allEnd.line = line;tokens.add(AllEnd.allEnd);return true;case ' ':if (readch(' ')) {readch();LineEnd.lineEnd.line = line;tokens.add(LineEnd.lineEnd);line++;return true;}case '(':readch();Delimiter.lpar.line = line;tokens.add(Delimiter.lpar);return true;case ')':readch();Delimiter.rpar.line = line;tokens.add(Delimiter.rpar);return true;case ';':readch();Delimiter.sem.line = line;tokens.add(Delimiter.sem);return true;case '+':readch();CalcWord.add.line = line;tokens.add(CalcWord.add);return true;case '-':readch();CalcWord.sub.line = line;tokens.add(CalcWord.sub);return true;case '*':readch();CalcWord.mul.line = line;tokens.add(CalcWord.mul);return true;case '/':readch();CalcWord.div.line = line;tokens.add(CalcWord.div);return true;case ':':if (readch('=')) {readch();CalcWord.assign.line = line;tokens.add(CalcWord.assign);return true;}break;case '>':if (readch('=')) {readch();CalcWord.ge.line = line;tokens.add(CalcWord.ge);return true;}break;case '<':if (readch('=')) {readch();CalcWord.le.line = line;tokens.add(CalcWord.le);return true;}break;case '!':if (readch('=')) {readch();CalcWord.ne.line = line;tokens.add(CalcWord.ne);return true;}break;}return false;}/*下面開始分割關鍵字,標識符等信息*/public Token scan() throws IOException {Token tok;while (character == ' ')readch();if (isDigit() || isSign() || isLetter()) {tok = tokens.get(tokens.size() - 1);} else {tok = new Token(character);printError(tok);}return tok;}}I. 如何學習JAVA
如何學習java?
在這里我來為您提供一下Java學習的詳細路線:
這是Java全套系列的學習思維導圖:Java學習思維導圖
高琪老師是我校著名的Java講師,其課程也是受到廣大初學者所喜愛;
如果有的小夥伴想要學Java編程,可以在下方評論領取視頻!有最新的Java課程;
那麼現在來說一下,Java編程初學者應該如何快速入門:
1、按階段規劃,時間留夠,但一定要有互相催促的夥伴,否則會很孤獨也難以堅持,夥伴得挑好了,別把你帶歪了。
2、有了夥伴先學習HTML+CSS,做點網頁出來,讓自己心中對軟體行業充滿成就感,這樣說培養自己的興趣的一種,俗話說興趣是最好的老師,沒有興趣走不遠。
3、然後學習簡單Java語法,寫簡單的流程式控制制語句,簡單數據結構,當邏輯思維和數據結構達到一個3層循環都能搞清楚的水準的時候,馬馬虎虎可以進入下一步了
4、進入Java面向對象的學習,搞清楚類、對象,封裝繼承多態,內部類,對象的概念,然後進入常用集合和泛型以及集合的底層數據結構的學習
5、學習IO流,能夠操作讀取大文件,多線程,Socket編程,學完之後使用JavaSE的基礎做一個五子棋游戲,或者QQ聊天,強化一下自己的知識。
6、進入資料庫學習,先學習MySQL,較為簡單常用,學完資料庫,也可以看看Redis的使用
7、進入JavaWeb課程的學習,以Servlet+Jsp為主,還有tomcat和http基礎,
8、學習JavaScritp+JQuery,結合JavaWeb做一個小的管理系統
9、進入JavaEE的學習,常用框架,主要是SpringMVC和Mybatis,學完之後試著去接觸微服務架構
10、學習Linux操作,使用Linux部署tomcat進行環境搭建,跑一個簡單的頁面出來
11、SpringBoot可以進行了解學習,Oracle可以進行了解學習。
最後:最上方詳細的學習線路圖,對比話術更加詳細,希望可以幫助到你們
J. Java培訓都學哪些知識
Java培訓一般會從以下四個方面著手。1、掌握Java語言的使用:語言語法、程序邏輯,OOP(面向對象)思想,封裝、繼承、多態,集合框架、泛型、File IO技術,多線程技術、socket網路編程,XML技術。編程有關的操作系統基本使用,HTML5規范、HTML5文檔結構、HTML5元素、Web語義化;CSS3規范、CSS3選擇器、層疊與繼承、盒模型與視覺格式化模型、現代CSS布局、CSS3基本屬性千鋒教育就有線上免費Java線上公開課。