< identifier > ::= < letter >|< identifier >< letter >|< identifier >< digit >
< number > ::= < digit >|< number >< digit >
< letter > ::= a|b|…|z|a|b|…|z
< digit > ::= 1|2|…|9|0
< singleword > ::= +|-|*|/|=|(|)||:|,|;|<|>|!
< doubleword > ::= >=|<=|!=|==|&&| ||
< comment_first > ::= /*
< comment_last > ::= */
保留字表:」if」, 「else」, 「for」, 「while」, 「do」, 「int」, 「read」, 「write」, 「call」, 「function」
lexer.h
#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
#include "string.h"
//下面定義保留字表,為簡化程式,使用字元指標陣列儲存所有保留字
//如果想增加保留字,可繼續新增,並修改保留字數目keywordsum
#define keywordsum 10
char *keyword[keywordsum] = ;
//下面定義純單分界符,如需要可新增
char singleword[50] = "+-*(){};,:\"\'";
//下面定義雙分界符的首字元
char doubleword[10] = "><=!";
//用於接收輸入輸出檔名,在test_main.c中定義
extern
char scanin[300] = "f:\\lexer\\in.txt", scanout[300] = "f:\\lexer\\out.txt";
//用於指向輸入輸出檔案的指標,在test_main.c中定義
extern file *fin, *fout;
//折半查詢
int midsearch(char **word_str, char word_temp);
//詞法分析函式
int testscan()
//判斷輸出檔名是否正確
if( ( fout = fopen( scanout, "w" ) ) == null )
ch = getc(fin);
while( ch != eof )
token[j] = '\0'; //識別符號組合結束
//查保留字
//折半查詢
n = midsearch( keyword, token );
if( n == 1 ) //不是保留字,輸出識別符號
fprintf( fout, "%s\t%s\n", "id", token );
if( n == 0 ) //是保留字,輸出保留字
fprintf( fout, "%s\n", token);
}else
if( isdigit(ch) )
token[j] = '\0';
fprintf( fout, "%s\t%s\n", "num", token );
}else
if( strchr( singleword, ch ) > 0 )else
if( strchr( doubleword, ch ) > 0 )else
//如果不是=,則為單分界符
token[1] = '\0';
fprintf( fout, "%s\t%s\n", token, token );//輸出單、雙分界符符號
}else
if( ch == '/' )while( ( ch != '*' || ch1 != '/' ) && ch1 != eof ); //知道遇到*/或者檔案尾
ch = getc(fin);
}else
}else
if ( ch == '&' )else
}else
if ( ch == '|' )else
}else
}fclose(fin);
fclose(fout);
return(es);
}int midsearch(char **word_str, char word_temp)else
if ( strcmp(word_str[i], word_temp )>0)
high = i - 1;
else
low = i + 1;
i = ( low + high )/2;
}if( low > high ) return
1;}
main.cpp#include "stdio.h"
#include "ctype.h"
#include "stdlib.h"
#include "string.h"
#include "lexer.h"
extern int testscan();
//char scanin[300] = "f:\\lexer\\in.txt", scanout[300] = "f:\\lexer\\out.txt";
file *fin, *fout;
int main()
in.txt@#int main()
out.txterror @
error #
intid main
( (
) )
}
編譯原理詞法分析
編譯原理實驗一 詞法分析練習 include include include define tokenmax 100 define progmax 1000 define k esc 27 void analytics 詞法分析 void scanner 輸入掃瞄 bool isletter cha...
詞法分析(編譯原理)
詞法分析 英語 lexical analysis 是電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer,簡稱lexer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱...
編譯原理詞法分析
1 注意識別符號和無符號整數的重複問題,本人採用map解決。2 cin ch自動忽略空白字元。include include include include using namespace std struct pairs int isboundaries char ch return 3 case...