构造使用类C语言的脚本引擎(3)作者 :kevin_qing
转贴请注明
现在回到编译器上的构造上。
编译分为4个步骤
1.预处理
在这里我只是替换掉源文件的字符
'\r'->'\n'
'\0'->0x20 (空格)
并且在源文件最后加上'\0'
2.词法分析.
词法分析主要是将输入流分割为一个个的单词,在这里我并未使用flex而是自己实现。(看到正则表达式就晕,更别说叫我写了,而且注视的正则也不好写,还不如自己做比较清晰)
处理逻辑,读取一个字符,判断其可能的单词,并进入后继处理,这里涉及到回滚问题。
伪代码:
gc() 是从输入流读取一个字符pb(n)是返回n个字符
uint32_t Lex(){
while(1){
CChar ch=gc();
if(ch.isSpace())
continue;
if(ch.isReturn())
continue;
if(ch=='\0')
return NULL;
if(ch.isLetter()){
return readID(ch);
}
switch(ch){
case '"':
return _readString();
case '/':
ch=gc();
if('/'==ch)
return _readComment(0);
elif('*'==ch)
return _readComment(1);
elif('='==ch)
return DIV_ASSIGN;
else {
pb();
return DIV;
}
case '+':
其余符号处理类似上面......
}
}
}