Sicily1000 自上而下語法分析(一)

2021-08-13 16:43:18 字數 2333 閱讀 4733

輸入開始符號,非終結符,終結符,產生式,ll(1)分析表

輸出ll(1)分析表

g[e]:e →e+t | e-t | t

t →t*f | t/f | f

f →(e) | d

d →x | y | z

消除左遞迴g1[e]:

e →ta

a →+ta | -ta | e

t →fb

b →*fb | /fb | e

f →(e) | d

d →x | y | z

input

輸入開始符號;

非終結符個數,非終結符,空格符分隔;

終結符個數,終結符,空格符分隔;

產生式的個數,各產生式的序號,產生式的左邊和右邊符號,空格符分隔;

ll(1)分析表中的產生式個數,序號,行符號,列符號,產生式編號,空格符分隔;

output

第一行:空,安終結符循序輸出終結符,結束符『#』,每個符號佔5格;

其餘行:非終結符符號,各對應終結符的產生式的右邊,每個符號佔5格;

通過題目的例子我們不難發現,題目就是要求我們根據產生式構造出ll(1)分析表。我們先結合上面的例子來看看ll(1)分析表是如何構建的。

可以看到,ll(1)分析表的行是各個非終結符,列是各個終結符。然後結合輸入的產生式,比如第乙個ll(1)分析表產生式是:1 e ( 1。通過題目我們知道這個式子表示行為e、列為(對應的位置是1號產生式,即1 e ta。其它式子依此類推,就可以得到ll(1)分析表。

現在問題的關鍵是如何將非終結符、終結符、產生式、ll(1)產生式進行儲存。根據題目的例子,我們知道上面每個都有幾個表項,因此不難想到要用結構體。想到了這一點,問題就好辦多了。

根據題目的樣例,我們知道,#也屬於終結符,但輸入中並沒有體現,因此,在輸入的最後還要將其進行特殊處理、加入到終結符中。

然後根據我們上面提到的構造ll(1)分析表的思路,我們對所有的ll(1)分析表產生式進行遍歷,根據產生式的行符號、列符號和產生式序號進行一一對應填充,最後將其輸出,就順利解決了。

#include

#include

using

namespace

std;

struct non_terminal

;struct terminal

;struct produce

;struct ll1_produce

;int main()

cin >> terminal.count;

for (int i = 0; i < terminal.count; i++)

cin >> produce.count;

for (int i = 0; i < produce.count; i++)

cin >> ll1_produce.count;

for (int i = 0; i < ll1_produce.count; i++)

terminal.sign[terminal.count] = "#";

terminal.count++;

for (int i = 0; i < ll1_produce.count; i++)

}for (int k = 0; k < terminal.count; k++)

}non_terminal.ll[row][col] = produce.right[ll1_produce.order[i] - 1];

}cout

<< " ";

for (int i = 0; i < terminal.count; i++)

cout

<< endl;

for (int i = 0; i < non_terminal.count; i++)

cout

<< non_terminal.sign[i];

for (int j = 0; j < terminal.count; j++)

cout

<< non_terminal.ll[i][j];

}cout

<< endl;

}return

0;}

Sicily1000 詞法分析

input 輸入一程式,結束符用 output 輸出單詞數對 類號,序號 輸出識別符號表,用空格分隔 輸出無符號整數表,用空格分隔 輸入樣例 main 輸出樣例 1,1 3,0 3,1 3,2 1,0 4,0 2,2 5,0 3,4 4,1 2,2 5,1 3,5 1,2 5,0 2,1 4,1 2...

Sicily 1000 詞法分析程式設計

description input 輸入一程式,結束符用 output 輸出單詞數對 類號,序號 輸出識別符號表,用空格分隔 輸出無符號整數表,用空格分隔 sample input main sample output 1,1 3,0 3,1 3,2 1,0 4,0 2,2 5,0 3,4 4,1 ...

語法分析 自上而下分析

語法分析 是編譯過程的核心部分。它的任務是在詞法分析識別出單詞符號串的基礎上,分析並判定程式的語法結構是否符合語法規則。語言的語法結構是用上下文無關文法描述的。因此,語法分析器的工作本質上就是按文法的產生式,識別輸入符號串是否為乙個句子。這裡所說的輸入串是指由單詞符號 文法的終結符 組成的有限序列。...