●程序实现: 使用两个过程:S()和A(),它们送回true or false,决定于它们是否在输入串中找到相应的非终结 符所构成的串。 ●使用记号: input_symbol:当前符号内容 input_pointer:输入字符指针 ●使用过程: ADVANCE():把input_pointer移到下一输入符号 位置,置input_symbol是当前符号内容;
⚫程序实现: ⚫使用记号: input_symbol:当前符号内容 input_pointer:输入字符指针 ⚫使用过程: ADVANCE( ):把input_pointer移到下一输入符号 位置,置input_symbol是当前符号内容; 使用两个过程:S( )和A( ),它们送回true or false,决定于它们是否在输入串中找到相应的非终结 符所构成的串
procedure S(); procedure A(); begin begin isave:=input_pointer; if input symbol='c'then if input_symbol=a'then begin begin ADVANCE(); ADVANCE(); if A()then if inputSymbol=‘b' then begin if inputSymbol=‘d' ADVANCE();return else; then end begin end ADVANCE(); /*failure to find ab*/ return true input_pointer:=isave; end if inputSymbol=‘a' then end; begin ADVANCE();return true; return false; end end; else return false; end;
procedure S( ); begin if input_symbol =‘c’then begin ADVANCE( ); if A( ) then if inputSymbol=‘d’ then begin ADVANCE( ); return true end end; return false; end; procedure A( ); begin isave:= input_pointer; if input_symbol= ‘a’ then begin ADVANCE( ); if inputSymbol = ‘b’ then begin ADVANCE( ); return else; end end /*failure to find ab*/ input_pointer:=isave; if inputSymbol = ‘a’ then begin ADVANCE( ); return true; end else return false; end;
2、困雅和问题 ●文法的左递归 ●回溯 ●用替换符的顺序会影响所接受的语言 如:A一>ab/a改为A一>a/ab ●雅以报告出错的确切位置 ●穷举试探法—低效的分析方法
2、困难和问题 ⚫文法的左递归 ⚫回溯 ⚫用替换符的顺序会影响所接受的语言 如:A —> ab|a 改为 A —> a|ab ⚫难以报告出错的确切位置 ⚫穷举试探法——低效的分析方法
三、自上而下分析的问题解决 >消除文法的左递归 >克服回湖问题
三、自上而下分析的问题解决 ➢消除文法的左递归 ➢克服回溯问题
1、区分三种类型的左递归 -直接左递归 ~潜在左递归 即形如:N->Na 即形知:N->aN 间接左递归 而u吉e 即形如:N->Aa A->BB B->NY
1、区分三种类型的左递归 -直接左递归 即形如:N->Nα -间接左递归 即形如:N->Aα A->Bβ B->Nγ -潜在左递归 即形如:N->αN 而α ε