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;