最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言設計實現(xiàn)掃描器的自動機的示例詳解

 更新時間:2022年12月28日 10:51:25   作者:heart_6662  
這篇文章主要為大家詳細介紹了如何利用C語言設計實現(xiàn)掃描器的自動機,可識別的單詞包括:關鍵字、界符、標識符和常整型數(shù),感興趣的小伙伴可以了解一下

題目內(nèi)容

內(nèi)容:

1.設計掃描器的自動機;

2.設計翻譯、生成Token的算法;

3.編寫代碼并上機調(diào)試運行通過。

要求:

掃描器可識別的單詞包括:關鍵字、界符、標識符和常整型數(shù)。

其中關鍵字表、界符表、標識符表、常整數(shù)表如下:

關鍵字表K(1int 2void 3break 4float 5while 6do 7struct 8coust 9case 10for 11return 12if 13default 14else)

界符表 P(1 - 2 / 3 ( 4 ) 5 -- 6<= 7< 8+ 9* 10> 11= 12, 13; 14++ 15 { 16 } 17 ' 18 " )

標識符表I (1 2 3 4 5 6 7 8 9 10 11 12 13 14)

常整數(shù)表C(1 2 3 4 5 6 7 8 9 10 11 12 13 14)

【輸入形式】

源程序文件。

【輸出形式】

(1)相應單詞的Token序列;

(2)標識符表,常數(shù)表。

【測試用例1】

輸入:x10=x+y1*120+10;

輸出:

Token序列:(I 1)(P 11)等等

標識符表:x10 x y1

常數(shù)表:120 10

思路

題目中的輸出形式是:(1)相應單詞的Token序列;(2)標識符表,常數(shù)表。因此,我們可以在上述代碼中調(diào)整輸出的格式。

對于 Token 序列的輸出,我們可以將其格式化為如下形式:

Token序列:(<單詞種類>, <單詞內(nèi)容>)

例如:(KEYWORD, int)(IDENTIFIER, x)(DELIMITER, =)(INTEGER, 10)

對于標識符表和常整數(shù)表的輸出,我們可以將其格式化為如下形式:

標識符表: x y

常整數(shù)表: 10 20

為了實現(xiàn)這種輸出格式,我們可以在輸出 Token 序列之后,再輸出標識符表和常整數(shù)表。

代碼

#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
// 定義單詞種類
typedef enum {
  KEYWORD,   // 關鍵字
  DELIMITER, // 界符
  IDENTIFIER,// 標識符
  INTEGER    // 常整型數(shù)
} TokenType;
 
// 關鍵字表
char *keywords[] = {
  "int", "void", "break", "float", "while", "do",
  "struct", "const", "case", "for", "return", "if",
  "default", "else"
};
 
// 界符表
char delimiters[] = {
  '-', '/', '(', ')', '--', '<=', '<', '+', '*', '>',
  '=', ',', ';', '++', '{', '}', '\'', '"'
};
 
// 標識符表
char *identifiers[100];
int identifier_count = 0;
 
// 常整數(shù)表
int integers[100];
int integer_count = 0;
 
// Token 序列
struct Token {
  TokenType type; // 單詞種類
  char *lexeme;   // 單詞內(nèi)容
  int value;      // 單詞值
} tokens[100];
int token_count = 0;
 
// 讀入的源程序
char source[100];
int source_pos = 0;
 
// 讀入下一個字符
char get_char() {
  return source[source_pos++];
}
 
// 跳過空白符
void skip_space() {
  while (isspace(source[source_pos])) source_pos++;
}
 
// 讀入單詞
void get_token() {
  skip_space();
 
  char ch = get_char();
 
  // 如果是字母,則讀入單詞
  if (isalpha(ch)) {
    int lexeme_pos = 0;
    char lexeme[100];
    while (isalpha(ch) || isdigit(ch)) {
      lexeme[lexeme_pos++] = ch;
      ch = get_char();
    }
    lexeme[lexeme_pos] = '\0';
    source_pos--; // 將最后讀入的非字母或數(shù)字字符放回去
 
    // 判斷是否為關鍵字
for (int i = 0; i < 14; i++) {
if (strcmp(keywords[i], lexeme) == 0) {
tokens[token_count].type = KEYWORD;
tokens[token_count].lexeme = lexeme;
token_count++;
return;
}
}
 
 
// 如果不是關鍵字,則加入標識符表
identifiers[identifier_count] = lexeme;
tokens[token_count].type = IDENTIFIER;
tokens[token_count].lexeme = lexeme;
tokens[token_count].value = identifier_count;
identifier_count++;
token_count++;
return;
}
 
// 如果是數(shù)字,則讀入常整數(shù)
if (isdigit(ch)) {
int value = 0;
while (isdigit(ch)) {
value = value * 10 + (ch - '0');
ch = get_char();
}
source_pos--; // 將最后讀入的非數(shù)字字符放回去
 
 
// 加入常整數(shù)表
integers[integer_count] = value;
tokens[token_count].type = INTEGER;
tokens[token_count].value = value;
integer_count++;
token_count++;
return;
}
 
// 如果是界符,則讀入界符
for (int i = 0; i < 18; i++) {
if (delimiters[i] == ch) { 
// 加入 Token 序列
tokens[token_count].type = DELIMITER;
tokens[token_count].lexeme = ch;
token_count++;
return;
}
}
}
 
int main() {
// 讀入源程序
scanf("%s", source);
 
// 讀入 Token 序列
while (source_pos < strlen(source)) {
get_token();
}
 
// 輸出 Token 序列
for (int i = 0; i < token_count; i++) {
if (tokens[i].type == KEYWORD) {
printf("(KEYWORD, %s)\n", tokens[i].lexeme);
} else if (tokens[i].type == IDENTIFIER) {
printf("(IDENTIFIER, %s)\n", tokens[i].lexeme);
} else if (tokens[i].type == INTEGER) {
printf("(INTEGER, %d)\n", tokens[i].value);
} else if (tokens[i].type == DELIMITER) {
printf("(DELIMITER, %c)\n", tokens[i].lexeme);
}
}
 
// 輸出標識符表
printf("\nIdentifier Table:\n");
for (int i = 0; i < identifier_count; i++) {
printf("%s\n", identifiers[i]);
}
 
// 輸出常整數(shù)表
printf("\nInteger Table:\n");
for (int i = 0; i < integer_count; i++) {
printf("%d\n", integers[i]);
}
 
return 0;
}

到此這篇關于C語言設計實現(xiàn)掃描器的自動機的示例詳解的文章就介紹到這了,更多相關C語言掃描器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于C++的.cpp文件運行全過程

    關于C++的.cpp文件運行全過程

    這篇文章主要介紹了C++的.cpp文件運行全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++算法之海量數(shù)據(jù)處理方法的總結分析

    C++算法之海量數(shù)據(jù)處理方法的總結分析

    本篇文章是對海量數(shù)據(jù)處理方法進行了詳細的總結與分析,需要的朋友參考下
    2013-05-05
  • Qt中JSON使用的詳細步驟

    Qt中JSON使用的詳細步驟

    本文主要介紹了Qt中JSON使用的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • C語言中#define在多行宏定義出錯的原因及分析

    C語言中#define在多行宏定義出錯的原因及分析

    這篇文章主要介紹了C語言中#define在多行宏定義出錯的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • FFmpeg實現(xiàn)多線程編碼并保存mp4文件

    FFmpeg實現(xiàn)多線程編碼并保存mp4文件

    這篇文章主要為大家介紹了FFmpeg如何持續(xù)的從指定內(nèi)存中讀取原始數(shù)據(jù),再將解碼數(shù)據(jù)存入隊列中,并通過單獨的線程進行編碼,最后保存為mp4文件,感興趣的可以了解下
    2023-08-08
  • C++ 讀文件 將文件內(nèi)容讀入到字符串string中的方法

    C++ 讀文件 將文件內(nèi)容讀入到字符串string中的方法

    今天小編就為大家分享一篇C++ 讀文件 將文件內(nèi)容讀入到字符串string中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C語言中getchar()函數(shù)的用法小結

    C語言中getchar()函數(shù)的用法小結

    這篇文章主要介紹了C語言中getchar()函數(shù)的用法,getchar是輸入函數(shù),輸入的過程是什么呢,本文給大家詳細講解,對C語言getchar()函數(shù)相關知識感興趣的朋友一起看看吧
    2022-10-10
  • 如何使用C語言實現(xiàn)細菌的繁殖與擴散

    如何使用C語言實現(xiàn)細菌的繁殖與擴散

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)細菌的繁殖與擴散,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 基于C語言實現(xiàn)推箱子游戲

    基于C語言實現(xiàn)推箱子游戲

    這篇文章主要為大家詳細介紹了基于C語言實現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C語言實現(xiàn)最大間隙問題實例

    C語言實現(xiàn)最大間隙問題實例

    這篇文章主要介紹了C語言實現(xiàn)最大間隙問題的方法,是一個比較經(jīng)典的算法設計問題,對于學習算法設計有一定的借鑒價值,需要的朋友可以參考下
    2014-09-09

最新評論

鄂伦春自治旗| 元朗区| 湘西| 利川市| 辉县市| 靖江市| 南开区| 南阳市| 太保市| 巴塘县| 长葛市| 留坝县| 石泉县| 盘锦市| 宁强县| 汝州市| 天全县| 合江县| 禄劝| 勃利县| 九台市| 阿坝| 喀喇| 阳原县| 延吉市| 吐鲁番市| 宜春市| 西乌珠穆沁旗| 炉霍县| 饶河县| 满洲里市| 霍林郭勒市| 奉贤区| 旬阳县| 额尔古纳市| 台中市| 柳河县| 类乌齐县| 苍南县| 淮南市| 封开县|