摘要:目前為止我們創建的文件列表新上一章中我們提到了個方法它們可以用來描述非終結符和展開式的形式,那么它們又是如何工作的呢文件中定義了一些方法。特別的,注意如下代碼這個方法可以紀錄被掉的一組非終結符,紀錄這些東西有什么用,將在隨后的章節介紹。
目前為止我們創建的文件列表:
|- com.taozeyu.taolan.analysis |- FirstSetConstructor |- LexicalAnalysis |- LexicalAnalysisException |- NonTerminalSymbol |- SignParser |- SyntacticDefine[新] |- TerminalSymbol |- Token
上一章中我們提到了 4 個方法:
node
token
or
sign
它們可以用來描述非終結符和展開式的形式,那么它們又是如何工作的呢?
SyntacticDefine.java 文件中定義了一些 static 方法。 static NonTerminalSymbol getNonTerminalSymbol(Exp exp) { return expContainer.get(exp); } private static NonTerminalSymbol node(Exp exp) { return new NonTerminalSymbol(exp); } private static NonTerminalSymbol node() { return new NonTerminalSymbol(null); } private static TerminalSymbol token(Type type, String value) { return new TerminalSymbol(type, value); } private static TerminalSymbol token(Type type) { return new TerminalSymbol(type, null); }
可以看出,這些方法只是稍微封裝了一下,具體還要繼續追蹤 TerminalSymbol.java 和 NotTerminalySymbol.java。
先看看 TerminalSymbol.java 的相關代碼:
public final Type type; public final String value; final boolean careValue; TerminalSymbol(Type type, String value) { this.type = type; this.value = value; this.careValue = careValueTypeSet.contains(type); }
原來只是直接保存成變量罷了。
再看 NotTerminalySymbol.java 的相關代碼:
final Exp exp; Character sign = null; final ArrayList
定義了這些成員變量,其中 expansionList 代表展開式,它由一組 Object[] 組成。
NonTerminalSymbol(Exp exp) { this.exp = exp; } NonTerminalSymbol or(Object...args) { expansionList.add(args); return this; } NonTerminalSymbol sign(char sign) { this.sign = sign; return this; }
NotTerminalySymbol 也是把這些定義的東西保存起來,只不過每個方法返回 this,因此允許我連續調用這些方法。
特別的,注意如下代碼:
final ArrayListbanList = new ArrayList<>(); NonTerminalSymbol ban(TerminalSymbol...args) { for(TerminalSymbol node:args) { banList.add(node); } return this; }
這個方法可以紀錄被 ban 掉的一組非終結符,紀錄這些東西有什么用,將在隨后的章節介紹。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65541.html
摘要:希臘字母表示空,這個產生式表明非終結符可以產生一個空。此外,對于一個文法之中的非終結符,還有集集的概念。對于一個非終結符而言,它的集指可能展開的各種形式中,位于第一的所有終結符所組成的集合。 上一章中,我說 Parser 的工作就是依據文法定義,找到一個與源代碼匹配的展開方案就可以了。聽起來我們只要先給出一個 tao 語言的文法定義,然后寫一個找匹配方案的的程序就可以了。 然而事情情況...
摘要:一個非終結符可以被展開稱為一個串,如上定義便是將這個非終結符展開稱為一個又終結符和非終結符混合而成的串。特別注意我定義的方法僅僅用于修飾非終結符,而非展開式,雖然這個例子中我的方法更靠近方法,但并意味著用于修飾展開式。 各位久等了,本系列在新一年的連載中,形式會加入少許變化。首先,我會將 tao 語言編譯器(以及運行環境)的全部內容貼在 GitHub 上,在閱讀本系列的時候,需要對照 ...
摘要:從展開式中,可以看出,除了這個非終結符,還有其他一些非終結符。是可能展開的形式之一,在語言中,如下代碼就是一行典型的從表達式來看,它是由一個級表達式和一個類型的非終結符組成。但特別注意結尾的數量詞表明,整個非終結符都是可選的。 目前為止我們創建的文件列表: |- com.taozeyu.taolan.analysis |- FirstSetConstructor |- ...
摘要:是的,這個系列將呈現一個完整的編譯器從無到有的過程。但在寫這個編譯器的過程中,我可不會偷工減料,該有的一定會寫上的。該語言的虛擬機將運行于之上,同時編譯器將使用實現。我早有寫編譯器的想法之前沒寫過,故希望一邊寫編譯器一邊完成這個系列。 是的,這個系列將呈現一個完整的編譯器從無到有的過程。當然,為了保證該系列內容的簡潔(也為了降低難度),僅僅保證編譯器的最低要求,即僅能用。但在寫這個編譯...
摘要:而,稱之為非終結符。而這個展開方案中對各個非終結符產生式的選擇過程,即是對源代碼中每一個部分的定性過程。這個過程讓能夠理解源代碼各個部分表示的含義,并以此生成對應的語法樹。 我需要定義出 tao 語言的細節,在此,需要引出文法這一概念。所謂文法,即是用于描述語言的一種工具。 例如,一個賦值語句可能寫成如下形式: variable = 1 + 3 如何充分定義這個賦值語句的形...
閱讀 1201·2021-11-24 11:16
閱讀 3428·2021-11-15 11:38
閱讀 1920·2021-10-20 13:47
閱讀 546·2021-09-29 09:35
閱讀 2192·2021-09-22 15:17
閱讀 1013·2021-09-07 09:59
閱讀 3374·2019-08-30 13:21
閱讀 2904·2019-08-30 12:47