成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

從零開(kāi)始寫(xiě)個(gè)編譯器吧 - tao 語(yǔ)言的文法定義(下)

Michael_Lin / 3304人閱讀

摘要:目前為止我們創(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 = new 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 ArrayList banList = 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

相關(guān)文章

  • 從零開(kāi)始寫(xiě)個(gè)譯器 - LL(1)

    摘要:希臘字母表示空,這個(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è)找匹配方案的的程序就可以了。 然而事情情況...

    Tony 評(píng)論0 收藏0
  • 從零開(kāi)始寫(xiě)個(gè)譯器 - tao 語(yǔ)言文法定義(上)

    摘要:一個(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ì)照 ...

    wuyangchun 評(píng)論0 收藏0
  • 從零開(kāi)始寫(xiě)個(gè)譯器 - 程序流控制

    摘要:從展開(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 |- ...

    huangjinnan 評(píng)論0 收藏0
  • 從零開(kāi)始寫(xiě)個(gè)譯器系列

    摘要:是的,這個(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è)編譯...

    genedna 評(píng)論0 收藏0
  • 從零開(kāi)始寫(xiě)個(gè)譯器 - 文法簡(jiǎn)介

    摘要:而,稱之為非終結(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ǔ)句的形...

    stormzhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<