国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python 算符優(yōu)先分析法的設(shè)計實(shí)現(xiàn) 編譯原理

這篇具有很好參考價值的文章主要介紹了python 算符優(yōu)先分析法的設(shè)計實(shí)現(xiàn) 編譯原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

本文內(nèi)容:

1、給出文法如下:
G[E]

E->T|E+T;

T->F|T*F;

F->i|(E);
可以構(gòu)造算符優(yōu)先表如下:

+ * ( ) i
+ > < < > <
* > > < > <
( < < < = <
) > > >
i > > >


2、計算機(jī)中表示上述優(yōu)先關(guān)系,優(yōu)先關(guān)系的機(jī)內(nèi)存放方式有兩種1)直接存放,2)為優(yōu)先關(guān)系建立優(yōu)先函數(shù),這里由學(xué)生自己選擇一種方式;
3、給出算符優(yōu)先分析算法如下:

k:=1;S[k]:='#';
REPEAT
????????把下一個輸入符號讀進(jìn)a中;
????????IF S[k]屬于Vt?THEN j:=k ELSE j:=k-1;

????????WHILE S[j]>a DO
????????BEGIN
????????????????REPEAT

????????????????????????Q:=S[j];
????????????????????????IF S[j-1]屬于Vt?THEN j:=j-1 ELSE j:=j-2

????????????????UNTIL s[j]<Q
????????????????把S[j+1]...S[k]歸約為某個N;

????????????????k:=j+1;
????????????????S[k]:=N;
????????END OF WHILE;
????????IF S[j]<a OR S[j]=a THEN

????????BEGIN
????????????????k:=k+1;

????????????????S[k]:=a

????????END
????????ELSE ERROR

UNTIL a=‘#'

樣例:

python 算符優(yōu)先分析法的設(shè)計實(shí)現(xiàn) 編譯原理python 算符優(yōu)先分析法的設(shè)計實(shí)現(xiàn) 編譯原理

?代碼如下:

# 輸出結(jié)果
def output(str, a, b, type):
    global program
    program.append([type, str[a:b + 1]])


# 判斷字符串一部分是否屬于關(guān)鍵字
# 是返回1不是返回2
def iskeywords(str, a, b):
    # 關(guān)鍵字
    keywords = {"if", "int", "for", "while", "do", "return", "break", "continue"}
    s = str[a:a + b + 1]  # 拷貝字符
    if s in keywords:  # 判斷是否存在,存在返回1,否則返回2
        return 1
    else:
        return 2


# 判斷字符是否屬于運(yùn)算符或分隔符的一部分。
# 不是返回0,是返回1,是且后面能跟=號返回2
def belong_to(str, type):
    if type == 4:  # 選擇運(yùn)算符
        library = "+-*/=><!"  # 運(yùn)算符
    else:  # 選擇分隔符
        library = ",;{}()"  # 分隔符
    if str in library:  # 存在
        # 是可能后面跟=號的幾個符號
        if type == 4 and library.index(str) >= 4:
            return 2
        else:
            return 1
    return 0


# 遞歸的詞法分析函數(shù),讀入一行str字符串,初始位置 n = 0
# 分離+判斷,打印輸出類型
# 由之前的c語言版本改寫而成
def scan(str, n):
    # 7 種類型(最后輸出1 - 5)
    # -1
    # 0: 初始
    # 1: 關(guān)鍵字, 在keywords中
    # 2: 標(biāo)識符
    # 3: 常數(shù)(無符號整型)
    # 4: 運(yùn)算符和界符:+ - * / = > < >= <= !=
    # 5: 分隔符:, ; {}()
    i = n
    type = 0
    while i < len(str):
        if type == 0:  # 初始態(tài)
            if str[i] == ' ':  # 空格跳過
                n += 1
                i += 1
                continue
            elif str[i] == '\0' or str[i] == '\n':  # 是結(jié)束
                return
            elif ('a' <= str[i] <= 'z') or ('A' <= str[i] <= 'Z'):
                type = 1  # 是字母,
            elif '0' <= str[i] <= '9':
                type = 3  # 是數(shù)字,常數(shù)
            else:
                type = belong_to(str[i], 4)
                if type > 0:  # 是運(yùn)算符
                    # 是能跟=號的運(yùn)算符,后面是=號
                    if type == 2 and str[i + 1] == '=':
                        i = i + 1  # 結(jié)束位置后移
                    output(str, n, i, 4)  # 輸出 + 遞歸 + 結(jié)束
                    scan(str, i + 1)
                    return
                elif belong_to(str[i], 5):  # 是分隔符
                    output(str, n, i, 5)  # 輸出 + 遞歸 + 結(jié)束
                    scan(str, i + 1)
                    return
                else:
                    print("失敗:", str[i])
                    return
        elif type == 1:  # 關(guān)鍵字或標(biāo)識符
            if not (('a' <= str[i] <= 'z') or ('A' <= str[i] <= 'Z')):  # 不是字母了
                if '0' <= str[i] <= '9':  # 是數(shù)字,只能是標(biāo)識符
                    type = 2
                else:  # 非字母數(shù)字
                    type = iskeywords(str, n, i - 1)
                    output(str, n, i - 1, type)  # 輸出 + 遞歸 + 結(jié)束
                    scan(str, i)
                    return
        elif type == 2:  # 標(biāo)識符
            if not (('a' <= str[i] <= 'z') or ('A' <= str[i] <= 'Z')):
                # 不是字母了
                if not ('0' <= str[i] <= '9'):
                    # 不是數(shù)字
                    output(str, n, i - 1, type)  # 輸出 + 遞歸 + 結(jié)束
                    scan(str, i)
                    return
        elif type == 3:
            if not ('0' <= str[i] <= '9'):
                # 不是數(shù)字
                output(str, n, i - 1, type)  # 輸出 + 遞歸 + 結(jié)束
                scan(str, i)
                return
        else:
            print("%d失敗" % type)
        i += 1


# 添加S->;E;,形成句子括號
# S->;E;        ;       ;
# E->T|E+T      +,*,i,( +,*,i,)
# T->F|T*F      *,i,(   *,i,)
# F->i|(E)      i,(     i,)
#   A-> ···aB···    b∈FIRSTVT(B)    a<b
#   A-> ···Bb···    a∈LASTVT(B)     a>b

#       +   *   (   )   i   ;
#   +   >   <   <   >   <   >
#   *   >   >   <   >   <   >
#   (   <   <   <   =   <
#   )   >   >       >       >
#   i   >   >       >       >
#   ;   <   <   <       <   =

# 算符分析函數(shù)
def Operator_Analysis():
    priority_relationship = {  # 優(yōu)先關(guān)系
        '+': {'+': '>', '*': '<', '(': '<', ')': '>', 'i': '<', ';': '>'},
        '*': {'+': '>', '*': '>', '(': '<', ')': '>', 'i': '<', ';': '>'},
        '(': {'+': '<', '*': '<', '(': '<', ')': '=', 'i': '<', ';': None},
        ')': {'+': '>', '*': '>', '(': None, ')': '>', 'i': None, ';': '>'},
        'i': {'+': '>', '*': '>', '(': None, ')': '>', 'i': None, ';': '>'},
        ';': {'+': '<', '*': '<', '(': '<', ')': None, 'i': '<', ';': '='}}
    p = program.copy()  # 剩余輸入串
    s = [';']  # 棧
    a = None  # 當(dāng)前符號
    k = 0
    j = 0
    while 1:
        # 讀入下一個符號
        a = p.pop(0)
        if a[0] == 2 or a[0] == 3:
            a = 'i'
        else:
            a = a[1]
        if not s[k] == 'F':  # 找找終結(jié)符
            j = k
        else:
            j = k - 1
        while priority_relationship[s[j]][a] == '>':  # 規(guī)約
            while 1:
                Q = s[j]
                if not s[j - 1] == 'F':
                    j = j - 1
                else:
                    j = j - 2
                if priority_relationship[s[j]][Q] == '<':  # 找到左括號結(jié)束
                    break
            if len(s[j + 1:k + 1]) % 2 == 0:    # 如果不是奇數(shù)就不是 a op b,a,(a),這幾種形式,
                print("錯誤")
                return -1

            s = s[0:j + 1]
            s.append('F')
            k = j + 1
        if priority_relationship[s[j]][a] == '<' or priority_relationship[s[j]][a] == '=':
            s.append(a)  # 入棧
            k = k + 1
        else:
            print("錯誤")
            return -1
        if a == ';':
            break
    print("正確")
    return 1


file = "program.txt"
file = open(file)  # 讀取文件
while i := file.readline():
    program = []  # 記錄讀到的句子
    scan(i, 0)
    print(i, end='')
    Operator_Analysis()
file.close()

結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-467119.html

10;
正確
1+2;
正確
(1+2)*3+(5+6*7);
正確
((1+2)*3+4;
錯誤
1+2+3+(*4+5);
錯誤
(a+b)*(c+d);
正確
((ab3+de4)**5)+1;錯誤

到了這里,關(guān)于python 算符優(yōu)先分析法的設(shè)計實(shí)現(xiàn) 編譯原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 編譯原理實(shí)驗(yàn)三:算符優(yōu)先分析算法的設(shè)計與實(shí)現(xiàn)

    編譯原理實(shí)驗(yàn)三:算符優(yōu)先分析算法的設(shè)計與實(shí)現(xiàn)

    實(shí)驗(yàn)三 算符優(yōu)先分析算法的設(shè)計與實(shí)現(xiàn) 一、 實(shí)驗(yàn)?zāi)康?根據(jù)算符優(yōu)先分析法,對表達(dá)式進(jìn)行語法分析,使其能夠判斷一個表達(dá)式是否正確。通過算符優(yōu)先分析方法的實(shí)現(xiàn),加深對自下而上語法分析方法的理解。 二、 實(shí)驗(yàn)要求 1、輸入文法??梢允侨缦滤阈g(shù)表達(dá)式的文法(你

    2024年02月06日
    瀏覽(99)
  • 【建模算法】層次分析法(Python實(shí)現(xiàn))

    【建模算法】層次分析法(Python實(shí)現(xiàn))

    在很多情況下,我們對事物評價,應(yīng)該要多維度評價。多維度評價之后我們要如何把它們合并成一個指標(biāo)用于比較事物的好壞呢,這時候需要對各個指標(biāo)賦權(quán), 層次分析法就是用來賦權(quán)重的了。 這個方法主觀性比較強(qiáng),在數(shù)據(jù)集比較小,實(shí)在不好比較的時候可以用這個方法

    2024年01月22日
    瀏覽(22)
  • 主成分分析法(PCA)及其python實(shí)現(xiàn)

    主成分分析法(PCA)及其python實(shí)現(xiàn)

    主成分分析法(Principal Component Analysis,PCA)是一種用于把高維數(shù)據(jù)降成低維,使分析變得更加簡便的分析方法。比如我們的一個樣本可以由 n n n 維隨機(jī)變量 ( X 1 , X 2 , . . . , X n ) (X_1,X_2,...,X_n) ( X 1 ? , X 2 ? , ... , X n ? ) 來刻畫,運(yùn)用主成分分析法,我們可以把這些分量用更

    2024年01月16日
    瀏覽(34)
  • 數(shù)學(xué)建模--層次分析法(AHP)的Python實(shí)現(xiàn)

    目錄 1.算法流程簡介 2.算法核心代碼 3.算法效果展示 算術(shù)平均法求得的權(quán)重為: [0.07243906 0.30125047 0.62631047] 幾何平均法求得的權(quán)重為: [0.7374984 ?0.17727613 0.08522547] 特征值權(quán)重法法求得的權(quán)重為: [0.07239208 0.30116321 0.62644471]

    2024年02月10日
    瀏覽(20)
  • Python PCA(主成分分析法)降維的兩種實(shí)現(xiàn)

    Python PCA(主成分分析法)降維的兩種實(shí)現(xiàn)

    ????????PCA降維,一般是用于數(shù)據(jù)分析和機(jī)器學(xué)習(xí)。它的作用是把一個高維的數(shù)據(jù)在保留最大信息量的前提下降低到一個低維的空間,從而使我們能夠提取數(shù)據(jù)的主要特征分量,從而得到對數(shù)據(jù)影響最大的主成分,便于我們對數(shù)據(jù)進(jìn)行分析等后續(xù)操作。 ????????例如,

    2023年04月17日
    瀏覽(21)
  • 【編譯原理】【C語言】實(shí)驗(yàn)三:遞歸下降分析法

    【編譯原理】【C語言】實(shí)驗(yàn)三:遞歸下降分析法

    C語言 實(shí)驗(yàn)環(huán)境:Visual Studio 2019 author:zoxiii ??用高級語言實(shí)現(xiàn)遞歸下降分析程序。使用輸入串i*(i+i),輸出分析棧中所有內(nèi)容,并給出分析結(jié)果。 ??自頂向下分析就是從文法的開始符觸發(fā)并尋找出這樣一個推導(dǎo)序列:推導(dǎo)出的句子恰好為輸入符號串;或者說,能否從根節(jié)

    2023年04月21日
    瀏覽(16)
  • 評價模型(一) 層次分析法(AHP),熵權(quán)法,TOPSIS分析 及其對應(yīng) PYTHON 實(shí)現(xiàn)代碼和例題解釋

    評價模型(一) 層次分析法(AHP),熵權(quán)法,TOPSIS分析 及其對應(yīng) PYTHON 實(shí)現(xiàn)代碼和例題解釋

    數(shù)學(xué)建模系列文章: 以下是個人在準(zhǔn)備數(shù)模國賽時候的一些模型算法和代碼整理,有空會不斷更新內(nèi)容: 評價模型(一)層次分析法(AHP),熵權(quán)法,TOPSIS分析 及其對應(yīng) PYTHON 實(shí)現(xiàn)代碼和例題解釋 評價模型(二)主成分分析、因子分析、二者對比及其對應(yīng) PYTHON 實(shí)現(xiàn)代碼和例

    2024年02月08日
    瀏覽(28)
  • 【編譯原理】 實(shí)驗(yàn)三 LL(1)分析法(LL1分析表的自動生成)

    【編譯原理】 實(shí)驗(yàn)三 LL(1)分析法(LL1分析表的自動生成)

    由于代碼較長,csdn對文章總長度有字?jǐn)?shù)限制,想只看完整代碼的請移步另一篇博客。 https://blog.csdn.net/qq_46640863/article/details/125705891 理論與習(xí)題講解移步視頻 https://www.bilibili.com/video/BV1zu4y1C7SL 1.實(shí)現(xiàn)LL(1)分析算法 2.輸入:教材中的算術(shù)表達(dá)式文法;待分析的語句(如i+i*i) 3.輸

    2024年02月06日
    瀏覽(21)
  • 層次分析法(matlab實(shí)現(xiàn))

    層次分析法(matlab實(shí)現(xiàn))

    ? ? ? ?在決策理論中,層次分析法是一種以 數(shù)學(xué) 和 心理學(xué) 為基礎(chǔ),組織和分析復(fù)雜決策的結(jié)構(gòu)化技術(shù),它代表了一種 量化決策標(biāo)準(zhǔn)權(quán)重 的準(zhǔn)確方法,通過成對比較,利用個別專家的經(jīng)驗(yàn)來估計因素的相對大小 ? ? ? ?在很多情況下,我們對事物的評價,應(yīng)該多維度的進(jìn)

    2024年02月09日
    瀏覽(17)
  • 【軟件測試】邊界值分析法測試用例設(shè)計實(shí)例

    原題鏈接:洛谷 P2602 [ZJOI2010] 數(shù)字計數(shù) 輸入兩個正整數(shù)a,b,求在 [ a , b ] [a,b] [ a , b ] 中的所有整數(shù)中,每個數(shù)碼(0~9)各出現(xiàn)了多少次。 輸入格式: 輸入兩個正整數(shù)a, b確定區(qū)間

    2023年04月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包