編譯 詞法分析

2021-07-24 08:47:09 字數 3011 閱讀 1801

< 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.txt
error   @

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...