表示式語法分析 遞迴子程式法

2021-07-23 17:24:35 字數 3429 閱讀 7822

time limit: 1000ms memory limit: 65536kb

submit

statistic

problem description

遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll(1)

文法。它的實現思想是對應文法中每個非終結符編寫乙個遞迴過程,每個過程的功能是識別由該非終結符推出的串,當某非終結符的產生式有多個候選式時能夠按

ll(1)

形式唯一地確定選擇某個候選式進行推導。請根據下面的表示式

ll(1)

文法,構造遞迴子程式,完成對表示式的語法分析。

表示式文法如下:

e→tg

g→+tg | ε

t→fs

s→*fs | ε

f→(e) | i

對於給定的輸入串(長度不超過50

個符號),請輸出分析過程中用到的所有產生式,並指明該輸入串是否為該文法能生成的表示式,

輸出共11

行,前10

行每行兩個資料用空格隔開,表示推導時所用產生式順序號(從

0開始),最後一行是

accept

,表示i+i*i

是文法能生成的合法表示式。注:其中&

符號代表文法中的ε符號。

例如:i+i*i是文法能生成的乙個表示式,輸出格式如下:

0 e-->tg

1 t-->fs

2 f-->i

3 s-->&

4 g-->+tg

5 t-->fs

6 f-->i

7 s-->*fs

8 f-->i

9 s-->&

10 g-->&

accept

i@i不是文法能生成的表示式,

輸出共5

行,前5

行每行兩個資料用空格隔開,表示推導時所用產生式序號(從

0開始),最後一行是

error

,表示i@i

不是文法能生成的表示式。

@不是合法的文法符號,輸出格式舉例:

0 e-->tg

1 t-->fs

2 f-->i

3 s-->&

4 g-->&

error

(i+i*i不是文法能生成的表示式,存在括號不匹配的語法錯誤,輸出格式舉例:

0 e-->tg

1 t-->fs

2 f-->(e)

3 e-->tg

4 t-->fs

5 f-->i

6 s-->&

7 g-->+tg

8 t-->fs

9 f-->i

10 s-->*fs

11 f-->i

12 s-->&

13 g-->&

error

input

輸入資料只有一行,代表待分析的符號串,以#

號結束

output

輸出推導過程中所有的產生式,按照使用順序給出。輸出詳細說明見題目描述中的例子。

example input

i+i*i#

example output

0 e-->tg
1 t-->fs
2 f-->i
3 s-->&
4 g-->+tg
5 t-->fs
6 f-->i
7 s-->*fs
8 f-->i
9 s-->&
10 g-->&
accept

hint

author

這個題我做了幾次都沒做對,感覺測試什麼的都沒問題,但就是不對最後請教大神才知道是oj平台的後台資料有問題。後台在處理資料時是把「)」符號當作乙個表示式的即:當數串中有「)」是需要輸出「f-->(e)」,這其實是錯誤的。但是為了ac沒辦法只有改了一下。

謹記此**的輸出是錯誤的,不應這樣分析:

#includechar a[1000],b[1000];

int top=0,j,l;

int main()

}a[top++]='e';

for(j=0;top>0;)

else if(a[top-1]=='g')

else if(c[j]=='+')

else

}else if(a[top-1]=='t')

else if(a[top-1]=='s')

else if(c[j]=='*')

else

}else if(a[top-1]=='f')

else if(c[j]=='i')

else

}else if(a[top-1]==')')

else

break;

}else

else

break;

}//printf("1\n");

}if(top==0&&c[j]=='#')

printf("accept\n");

else

printf("error\n");

}

個人感覺正確**應該是這樣的:

#includechar a[1000],b[1000];

int top=0,j,l;

int main()

}a[top++]='e';

for(j=0;top>0;)

else if(a[top-1]=='g')

else if(c[j]=='+')

else

}else if(a[top-1]=='t')

else if(a[top-1]=='s')

else if(c[j]=='*')

else

}else if(a[top-1]=='f')

else if(c[j]=='i')

else

}else

else

break;

}//printf("1\n");

}if(top==0&&c[j]=='#')

printf("accept\n");

else

printf("error\n");

}

c++:

#include#include#include#include#includeusing namespace std;

int num;

stacka;

stackb;

int f(char x,char y)

while(1)

else}}

}return 0;

}

表示式語法分析 遞迴子程式法

time limit 1000ms memory limit 65536kb submit statistic problem description 遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll 1 文法。它的實現思想是對應文法中每個非終結符編寫乙個遞迴過程,每個過程的功能是識別由...

表示式語法分析 遞迴子程式法

表示式語法分析 遞迴子程式法 time limit 1000 ms memory limit 65536 kib submit statistic problem description 遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll 1 文法。它的實現思想是對應文法中每個非終結符編寫...

表示式語法分析 遞迴子程式法

表示式語法分析 遞迴子程式法 time limit 1000 ms memory limit 65536 kib submit statistic problem description 遞迴子程式法是一種確定的自頂向下語法分析方法,要求文法是ll 1 文法。它的實現思想是對應文法中每個非終結符編寫...