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