編譯原理上機作業1——詞法分析器
/*
單詞符號 種別碼 單詞符號 種別碼
# 0 + 27
main 1 - 28
if 2 * 29
include 3 / 30
while 4 : 31
do 5 ? 32
static 6 < 33
int 7 != 34
double 8 == 35
struct 9 <= 36
break 10 > 37
else 11 >= 38
long 12 = 39
switch 13 ; 40
case 14 ( 41
typedef 15 ) 42
char 16 { 43
return 17 } 44
const 18 [ 45
float 19 ] 46
short 20 value 47
continue 21 const number 48
for 22
void 23
sizeof 24
default 25
hehe 26
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#define CLR(val) memset(val,0,sizeof(val))
char keyword[26][15]=
{
"main","if","include","while",
"do","static","int","double",
"struct","break","else","long",
"switch","case","typedef","char",
"return","const","float","short",
"continue","for","void","sizeof",
"default","hehe"
};
typedef struct n
{
char token[20];
int num;
struct n * next;
}node, *Node;
Node head = NULL;
Node next_node;
int cmp( const void * a, const void *b )
{
return strcmp( (char*)a, (char*)b );
};
void init_list( )
{
head = (Node)malloc(sizeof(node));
head->num = -1;
//strcpy( head->token, );
};
void insert_list( int num, char * temp )
{
Node newnode = (Node)malloc(sizeof(node));
//----------------------------
newnode->num = num;
strcpy( newnode->token, temp );
newnode->next = NULL;
//----------------------------
next_node->next = newnode;
next_node = next_node->next;
};
int is_keyword( char * temp )
{
for( int i = 0; i < 26; i++ )
if( strcmp(temp,keyword[i]) )
return i+1;
else
return 47;
};
void scaner()
{
int word_plus;
char word[100];
char temp[100];
int sum;
char input[100];
char *p;
while( fgets(input,100,stdin) )
{
strcpy( word, input );
//處理一行
p = word;
while( *p != '\n' )
{
word_plus = 0;
while( *p == ' ' || *p == 9 )
p++;
if( isalpha(*p) ) // 字母
{
CLR(temp);
//p++;
while( isalpha(*p) || (*p >=0 && *p <= 9) )
{
temp[word_plus++] = *p;
p++;
}
temp[word_plus] = '\0';
insert_list( is_keyword(temp), temp ); //判斷關鍵字函式
//插入連結串列
}
else if( *p >= '0' && *p <= '9' ) //數字
{
CLR(temp);
sum = 0;
while( (*p>='0' && *p<='9') )
{
sum = sum * 10 + *p-'0';
p++;
}
if( isalpha(*p) )
{
printf( "wrong " );
return ;
}
if( sum >= 32767 )
{
printf( "int too big" );
return ;
}
else
{
itoa(sum,temp,10);
insert_list( 48, temp );
}
}
else
{
switch( *p )
{
case '#':
insert_list( 0, "#" );
break;
case '+':
insert_list( 27, "+" );
break;
case '-':
insert_list( 28, "-" );
break;
case '*':
insert_list( 29, "*" );
break;
case '/':
insert_list( 30, "/" );
break;
case ':':
insert_list( 31, ":" );
break;
case '?':
insert_list( 32, "?" );
break;
case '<':
if( *(p+1) == '=' )
{
insert_list( 36, "<=" );
p++;
}
else
insert_list( 33, "<" );
break;
case '>':
if( *(p+1) == '=' )
{
insert_list( 38, ">=" );
p++;
}
else
insert_list( 37, ">" );
break;
case '=':
insert_list( 39, "=" );
break;
case ';':
insert_list( 40, ";" );
break;
case '(':
insert_list( 41, "(" );
break;
case ')':
insert_list( 42, ")" );
break;
case '{':
insert_list( 43, "{" );
break;
case '}':
insert_list( 44, "}" );
break;
case '[':
insert_list( 45, "[" );
break;
case ']':
insert_list( 46, "]" );
break;
default:
return ;
break;
}
p++;
}
}
}
}
int main()
{
freopen( "in.txt", "r", stdin );
freopen( "out.txt", "w", stdout );
//對關鍵字表 進行qsort() 使用二分查詢關鍵字 就26個單詞懶得寫了,效率上也過多提高
// qsort(keyword,26,sizeof(keyword[0]),cmp);
// for( int i = 0; i < 26; i++ )
// printf( "%s\n", keyword[i] );
init_list();
next_node = head;
//詞法分析函式
scaner();
//遍歷連結串列
for( Node t = head->next; t != NULL; t = t->next )
printf( "(%d, %s)\n", t->num, t->token );
return 0;
}
相關文章
- 編譯原理上機作業2——LL(1)語法分析編譯原理語法分析
- 【編譯原理】手工打造詞法分析器編譯原理詞法分析
- 【水汐の編譯原理】 詞法分析器 課題1編譯原理詞法分析
- 編譯原理上機作業4——LR(0)分析的DFA生成編譯原理
- 編譯原理上機作業3——算符優先演算法編譯原理演算法
- 詞法分析器詞法分析
- 編譯原理實驗1:詞法分析編譯原理詞法分析
- 編譯器前端之如何實現基於DFA的詞法分析器編譯前端詞法分析
- Lex詞法分析器詞法分析
- 詞法分析器Java詞法分析Java
- 實現指令碼直譯器 - 詞法分析器指令碼詞法分析
- 【編譯原理】手工打造語法分析器編譯原理語法分析
- 用Java寫編譯器(1)- 詞法和語法分析Java編譯語法分析
- 詞法分析器的實現詞法分析
- Monkey 01 lexer 詞法分析器詞法分析
- Go編譯原理系列3(詞法分析)Go編譯原理詞法分析
- 0920編譯原理詞法分析編譯原理詞法分析
- 一個詞法分析器原始碼的剖析詞法分析原始碼
- 編譯原理作業小結編譯原理
- 精讀《手寫 SQL 編譯器 – 詞法分析》SQL編譯詞法分析
- 精讀《手寫 SQL 編譯器 - 詞法分析》SQL編譯詞法分析
- 用Python實現 詞法分析器(Lexical Analyzer)Python詞法分析
- Go編譯原理系列2(詞法分析&語法分析基礎)Go編譯原理詞法分析語法分析
- 漢語言處理包HanLPv1.6.0釋出,感知機詞法分析器HanLP詞法分析
- Java 實現《編譯原理》簡單詞法分析功能Java編譯原理詞法分析
- Hanlp自然語言處理工具之詞法分析器HanLP自然語言處理詞法分析
- 核心編譯2.6.13.4(原創)part1編譯
- 小C語言--詞法分析程式(編譯原理實驗一)C語言詞法分析編譯原理
- C++模板”>>”編譯問題與詞法消歧設計C++編譯
- 編譯原理第一章作業編譯原理
- 關於Basic程式直譯器及編譯原理的簡單化(1)--詞法分析和代數式求值 (轉)C程式編譯原理詞法分析
- 編譯器實現之旅——第五章 實現語法分析器前的準備編譯語法分析
- 1014編譯原理第二次作業(修改版1)編譯原理
- 管理上的操作原則
- C語言編譯器開發之旅(一):詞法分析掃描器C語言編譯詞法分析
- 大學計算機必修課新講--編譯原理+作業系統+圖形學計算機編譯原理作業系統
- android 刷機ROM結構與編譯製作。Android編譯
- 英語語法(1) 名詞