資源簡介
詞法分析器 -(計算器版)

代碼片段和文件信息
#include?
#include?
#include?
#include?“token.h“
static?char?*st_line;
//?靜態變量,?解析器記憶傳入行?傳入行的地址
static?int?st_line_pos;
//已經解析到的具體位置
//詞法分析器是每傳入一個字符就調用一次get_taken?那么?對于數字而言,一個數往往會包含多個數字,
typedef?enum?{
//這個枚舉的作用是,將符合數值特征的指暫存起來
????INITIAL_STATUS
????IN_INT_PART_STATUS
????DOT_STATUS
????IN_FRAC_PART_STATUS
}?LexerStatus;
//詞法分析器的核心部分;?負責將記號實際分割
void
get_token(Token?*token)
{
????int?out_pos?=?0;
????LexerStatus?status?=?INITIAL_STATUS;//給status?設置初始值
????char?current_char;
????token->kind?=?BAD_TOKEN;
????while?(st_line[st_line_pos]?!=?‘\0‘)?{?//‘\0‘?表示這行字符串的最后一個。
????????current_char?=?st_line[st_line_pos];???//從0開始?第一個字符開始
????????if?((status?==?IN_INT_PART_STATUS?||?status?==?IN_FRAC_PART_STATUS)
????????????//當前是屬于整數?或??浮點數?的中間狀態。
????????????&&?!isdigit(current_char)?&&?current_char?!=?‘.‘)?{
????????????//并且要同時滿足當前??符號不是數字,不是?小數點
????????????token->kind?=?NUMBER_TOKEN;
????????????//把這個token?的類型確定為numbertoken
????????????sscanf(token->str?“%lf“?&token->value);
????????????//從token的str?屬性?中取出double?類型的值存到token->value
????????????//因為str中存的是字符串類型的值,而value?則是存的double?類型
????????????return;
????????}
????????if?(isspace(current_char))?{???//如果當前這個是空格
????????????if?(current_char?==?‘\n‘)?{??//如果是換行
????????????????token->kind?=?END_OF_LINE_TOKEN;??//將token的kind?設置為end?類型,結束本token
????????????????return;
????????????}
????????????st_line_pos++;?//只是空格,不是換行,下標往前移動?//1.2???+1
????????????continue;??//繼續執行while?循環體
????????}
????????if?(out_pos?>=?MAX_TOKEN_SIZE-1)?{?//每個token?最多保存100個?字符。超過100?的話,退出程序
????????????fprintf(stderr?“token?too?long.\n“);
????????????exit(1);
????????}
????????token->str[out_pos]?=?st_line[st_line_pos];//st_line_pos?行上下標,out_pos?token?下標。
????????st_line_pos++;
????????out_pos++;
????????token->str[out_pos]?=?‘\0‘;??//koken->str?是一個字符數組,其最后一個必須保存‘\0‘
????????//如果當前輸入的字符為+?-?*?/??直接將taken?的kind?屬性設置好,返回
????????if?(current_char?==?‘+‘)?{
????????????token->kind?=?ADD_OPERATOR_TOKEN;
????????????return;
????????}?else?if?(current_char?==?‘-‘)?{
????????????token->kind?=?SUB_OPERATOR_TOKEN;
????????????return;
????????}?else?if?(current_char?==?‘*‘)?{
????????????token->kind?=?MUL_OPERATOR_TOKEN;
????????????return;
????????}?else?if?(current_char?==?‘/‘)?{
????????????token->kind?=?DIV_OPERATOR_TOKEN;
????????????return;
????????}?else?if?(isdigit(current_char))?{
????????????if?(status?==?INITIAL_STATUS)?{
????????????????status?=?IN_INT_PART_STATUS;??//進入的是0-9?,則會將狀態修改為int?類型
????????????}?else?if?(status?==?DOT_STATUS)?{
????????????????status?=?IN_FRAC_PART_STATUS;??//點之后遇到數字?狀態改為小數
????????????}
????????}?else?if?(current_char?==?‘.‘)?{
????????????if?(status?==?IN_INT_PART_STATUS)?{
????????????????status?=?DOT_STATUS;?//進入的是小數點?,則會將狀態修改為dot??類型
????????????}?else?{
????????????????fprintf(stderr?“syntax?error.\n“);
????????????????exit(1);
????????????}
????????}?else?{
????????????fprintf(stderr
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4928??2017-03-15?16:31??lexicalanalyzer.c
?????文件???????2374??2008-12-19?07:38??parser.c
?????文件????????498??2017-03-15?16:35??token.h
-----------?---------??----------?-----??----
?????????????????7800????????????????????3
評論
共有 條評論