西安电子科技大学编译原理02-4直接编码型词法分析器示例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2
//结果判定,收尾
if( state == 3 ) { *token = '\0'; return len;} else { return 0; }
}
5
2. 识别(a|b)*abb的程序框架 <2> 直接编码的词法分析器(续1)
int getToken (char* src, char* token) { char *ptr =src; int len=0; int state=0; // 跳过开始的若干空白字符 for( ; *ptr!=‘\0’; ptr++ )
<2> 直接编码的词法分析器 在表驱动的词法分析器中,DFA是数据,用于指导驱动器 (模拟DFA 的代码) 对输入序列进行分析。 直接编码的词法分析器,将 DFA 和 识别输入序列的过程合 并在一起,直接用程序代码模拟DFA识别输入序列的过程。 问题:如何用程序模拟DFA的状态和它的状态转移? 1. 状态和状态转移与语句的对应关系 这里介绍不同 ① 初态→程序的开始(存于一个状态变量); 于教材的方法 ② 当前状态的判定→ 分支(case/if) ③ 状态转移→根据输入修改状态变量(case/if); ④ 扫描输入串→循环语句(loop); ⑤ 返回时,满足最长匹配原则。
}
++len; *token++ = *ptr;
4
ቤተ መጻሕፍቲ ባይዱ
int getToken (char* src, char* token) { char *ptr =src; int len=0; int state=0;
// 跳过开始的若干空白字符
a 1 b a 0 a b 3
b a b
// 扫描输入, 状态转移
2
int getToken (char* src, char* token) { char *ptr =src; int len=0; int state=0;
for( ; *ptr!=‘\0’; ptr++ ) if( *ptr == ' ' || *ptr == '\n') { ++len; continue; } else break;
1
2. 识别(a|b)*abb的程序框架 <2> 直接编码的词法分析器(续1) // 从 src 中分析第1个记号,若得到则存储在 token中; // 且返回已分析的字符个数, 否则返回 0 int getToken (char* src, char* token); void main() { char input[]="abb ab2"; // 输入 char tokenTxt[10]; // 记号文本 char *pS =input; // 指示待分析的输入 int len; while( (len=getToken(pS, tokenTxt)) >0 ) { printf("get a token: %s\n", tokenTxt); pS += len; // 跳过当前记号 } }
if( *ptr == ' ' || *ptr == '\n'){ ++len; continue; } else break; for( ; *ptr!=‘\0’; ptr++ ){ if( *ptr != ‘a’ && *ptr != ‘b’ )break; // 限定字母表 switch( state ){ // 当前状态的判定 case 0: // state 0 switch ( *ptr ){ case 'b': state = 0; break; case 'a': state = 1; break; } break; case 1: // state 1 switch ( *ptr ){ case 'a': state = 1; break; case 'b': state = 2; break; } break; case 2: // state 2 … // 与上面类似 break; case 3: // state 3 … // 与上面类似 break; } // end switch(state) ++len; *token++ = *ptr; // 结果判定 } // end for-loop if( state == 3 ) { *token = '\0'; return len;} else { return 0; }
// 跳过开始的若干空白字符
// 扫描输入, 状态转移
// 结果判定,收尾
}
3
int getToken (char* src, char* token) { char *ptr =src; int len=0; int state=0; // 扫描输入, 状态转移 for( ; *ptr!=‘\0’; ptr++ ){ if( *ptr != ‘a’ && *ptr != ‘b’ )break; // 限定字母表 switch( state ){ // 当前状态的判定 case 0: // state 0 switch ( *ptr ){ case 'b': state = 0; break; case 'a': state = 1; break; } a // 扫描输入, 状态转移 break; 1 case 1: // state 1 b switch ( *ptr ){ case 'a': state = 1; break; b a a case 'b': state = 2; break; } 0 2 a break; b b case 2: // state 2 3 … // 与上面类似 break; case 3: // state 3 … // 与上面类似 break; // 结果判定,收尾 } // end switch(state) } // end for-loop
// 扫描输入, 状态转移
}
6
相关文档
最新文档