编译原理课后答案(第三版 蒋立源 康慕宁编) 下载本文

case TWENT: i+=20;

break;

case TE:i+=10;

break;

default:break; }

}/*while*/

label: printf(\

return; }

24 (1)Dn表示的正规集是长度为2n任意a和b组成的字符串。

此正规式的长度是2n

用来识别Dn的DFA至多需要2n+1个状态。 25 从略。

26(1)由{}括住的,中间由任意个非{组成的字符串, 如{},{}},{a},{defg}等等。

(2)匹配一行仅由一个大写字母和一个数字组成的串,如A1,F8,Z2等。

(3)识别\\r\\n和除数字字符外的任何字符。

由’和’括住的,中间由两个’’或者非’和\\n组成的任意次的字符串。如’’’’, ‘a’,’bb’,’def’,’’’’’’等等

27O[Xx][0-9]*[a-fA-F]*|[0-9]+|(\\’([a-zA-Z]|\\\\[Xx][0-7][0-7a-fA-F]|\\\\0[01][0-7][0-7]|\\\\[a-z])\\’)

28^[a-zA-Z_]+[0-9]*[a-zA-Z_]*

29 参考程序如下: %{

#include

#include

#include

#define UPPER2

#define WHITE3 %}

upper[A-Z] %%

{upper}+returnUPPER;

\\t|\ %%

main(int argc,char *argv[]) {

int c,i;

if (argc==2) {

if ((yyin=fopen(argv[1],\ {

printf(\ } }

while ((c=yylex())!=EOF) {

if (c==2) {

for (i=0;yytext[i];i++)

printf(\

yytext[0]='\\000'; }

if (c==3)

printf(\

else printf(\ }

return; }

yywrap() {

return ; }

30 从略。

第四章习题参考答案 1.解:

(1)S→(S)Z21|()Z21|[S]Z31|[]Z31

A→(S)Z22|()Z22|[S]Z32|[]Z32

B→(S)Z23|()Z23|[S]Z33|[]Z33

Z11→ε|AZ11|BZ21

Z12→AZ12|BZ22Z13→AZ13|BZ23

Z21→Z11Z22→ε|Z12

Z23→Z13Z31→Z21

Z32→Z22Z33→ε|Z23

(2)S→bZ11|aZ21A→bZ12|aZ22

Z11→ε| AZ21Z12→AZ22Z21→SZ21Z22→ε|SZ22

(3)S→(T)Z11 | aZ11 | Z11S→(T)Z12 | aZ12 | Z12

Z11→ε| Z21Z12→Z22Z21→,SZ21Z22→ε|,SZ22

2.解:

SAbB1,1.1(表示第1步,用产生式1.1推导,以下同)

CAbbB2,2.1

edAbbB3,4.1

edCAbbB4,2.1

ededAbbbB5,4.1

edaAbbbB5,4.2 (不符合,改写第5步,用4.2)

edBfbbB4,2.2

edCSdfbbB5,3.1

ededSdfbbB6,4.1

edaSdfbbB6,4.2

eddfbbB5,3.2

eddfbbCSd6,3.1

eddfbbedSd7,4.1

eddfbbaSd7,4.2

eddfbbd6,3.2

3.解:以下Save表示save token_pointer value, Restore表示restore token_pointer value。 (1)文法没有左递归。

Function P:boolean;

Begin

Save;

P:=true;

If next_token=”begin” then

If next_token=’d’ then

If next_token=’;’ then

If X then

If next_token=”end” then return;

Restore;

P:=false; End;

Function X:boolean;

Begin

Save;

X:=true;

If next_token=’d’ then

If next_token=’;’ then

If X then return;