LL(1)語法分析程序設計與實現

制作一個簡單的C語言詞法分析程序_用c語言編寫詞法分析程序-CSDN博客文章瀏覽閱讀322次。C語言的程序中,有很單詞多符號和保留字。一些單詞符號還有對應的左線性文法。所以我們需要先做出一個單詞字符表,給出對應的識別碼,然后跟據對應的表格來寫出程序。_用c語言編寫詞法分析程序https://blog.csdn.net/lijj0304/article/details/134078944

前置程序詞法分析器參考這個帖子??

遞歸下降語法分析程序設計與實現-CSDN博客文章瀏覽閱讀127次。制作一個簡單的C語言詞法分析程序_用c語言編寫詞法分析程序-CSDN博客文章瀏覽閱讀276次。C語言的程序中,有很單詞多符號和保留字。一些單詞符號還有對應的左線性文法。所以我們需要先做出一個單詞字符表,給出對應的識別碼,然后跟據對應的表格來寫出程序。_用c語言編寫詞法分析程序前置程序詞法分析器參考這個帖子??。https://blog.csdn.net/lijj0304/article/details/134331022

遞歸下降實現語法分析可以看這個??

1.程序目標

制作一個LL(1)語法分析程序,程序可以識別詞法分析器的輸出文件中的二元序列,拼湊出用戶輸入。通過表驅動程序,實現賦值語句的LL(1)文法的LL(1)分析過程。算式的語法如下:

G[S]: S→V=E????????E→TE′????????E′→ATE|ε????????T→FT′????????T′→MFT′|ε????????F→ (E)|i????????A→+|-M→*|/????????V→i

2.程序設計

我根據給定的語法,計算處所需要用到的first集和follow集,接著做select集,然后可以做出LL(1)分析表:

i

+

-

*

/

(

)

#

S

SV=E

E

ETE’

ETE’

E’

E’ATE’

E’ATE’

E’ ε

E’ ε

T

TFT’

TFT’

T’

T’ ε

T’ ε

T’MFT’

T’MFT’

T’ ε

T’ ε

F

Fi

F(E)

M

M*

M/

A

A+

A-

V

Vi

LL(1)的語法分析部分使用棧的思想來實現,定義了一個字符串的棧stack,LL1分析過程中產生的串存儲在棧中,同時對于輸入串有一個定位指針,棧頂元素和指針指向的字符比對,一樣則棧頂元素出棧,指針往后移動。?

下面是程序LL(1)分析流程圖

?

3.完整程序?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_LEN 1000
char str[MAX_LEN];
char stack[MAX_LEN];
int top = 0;int LL1(char *str, char *stack) {int i = 0;while(str[i] != '#') {if(top < 0) return 0;if(stack[top] == str[i]) {printf("%c -> ", stack[top]);top--;i++;}else if(stack[top] == 'S') {if(str[i] == 'i') {stack[top++] = 'E';stack[top++] = '=';stack[top] = 'V';}else return 0;}else if(stack[top] == 'E') {if(str[i] == 'i') {stack[top++] = 'e';stack[top] = 'T';}else if(str[i] == '(') {stack[top++] = 'e';stack[top] = 'T';}else return 0;}else if(stack[top] == 'e') {if(str[i] == '+') {stack[top++] = 'e';stack[top++] = 'T';stack[top] = 'A';}else if(str[i] == '-') {stack[top++] = 'e';stack[top++] = 'T';stack[top] = 'A';}else if(str[i] == ')' || str[i] == '#') {printf("%c -> ", str[i]);top--;}else return 0;}else if(stack[top] == 'T') {if(str[i] == 'i') {stack[top++] = 't';stack[top] = 'F';}else if(str[i] == '(') {stack[top++] = 't';stack[top] = 'F';}else return 0;}else if(stack[top] == 't') {if(str[i] == '*') {stack[top++] = 't';stack[top++] = 'F';stack[top] = 'M';}else if(str[i] == '/') {stack[top++] = 't';stack[top++] = 'F';stack[top] = 'M';}else if(str[i] == '+' || str[i] == '-' || str[i] == ')' || str[i] == '#') {printf("%c -> ", str[i]);top--;}else return 0;}else if(stack[top] == 'F') {if(str[i] == 'i') stack[top] = 'i';else if(str[i] == '(') {stack[top++] = ')';stack[top++] = 'E';stack[top] = '(';}else return 0;}else if(stack[top] == 'A') {if(str[i] == '+')stack[top] = '+';else if(str[i] == '-')stack[top] = '-';else return 0;}else if(stack[top] == 'M') {if(str[i] == '*')stack[top] = '*';else if(str[i] == '/')stack[top] = '/';else return 0;}else if(stack[top] == 'V') {if(str[i] == 'i') stack[top] = 'i';else return 0;}else return 0;}return 1;
}int main() {for(int m = 1; m <= 4; m++) {printf("test%d:\n", m);char txt[] = "./lexical/analyze";char num[6];sprintf(num, "%d.txt", m);strcat(txt, num);FILE *fp = fopen(txt, "r");char buf[MAX_LEN] = "";char input[MAX_LEN] = "";fgets(buf, MAX_LEN, fp);int i = 0, j = 0;for(int k = 0; k < strlen(buf); k++) {if(buf[k] == '1' && buf[k+1] == ',') {str[i++] = 'i';k += 3;while(1) {if(buf[k] == ')' && buf[k+1] == ' ')break;input[j++] = buf[k++];}continue;}if(buf[k] == ',' && buf[k+1] == ' ') {k += 2;while(1) {if(buf[k] == ')' && buf[k+1] == ' ')break;str[i++] = buf[k];input[j++] = buf[k++];}}}printf("Input scentence: %s\n", input);str[i] = '#';fclose(fp);stack[0] = 'S', top = 0;int flag = LL1(str, stack);if(flag == 1) {printf("end\n");printf("Gramma legal: %s\n", str);}else {printf("error\n");printf("Gramma illegal\n");}}return 0;
}

?4.運行測試

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161127.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

國民新旅游時代,OTA們如何制勝新周期?

文 | 螳螂觀察&#xff08;TanglangFin&#xff09; 作者 | 圖霖 消費全面復蘇的大背景下&#xff0c;旅游業正迎來預期中的拐點。 一個顯著表現是&#xff0c;旅游消費正在從可選消費轉化成必選消費。 國內消費者旅游需求的不降反增&#xff0c;就是最好的印證。 同程研究…

DoFaker: 一個簡單易用的換臉工具

DoFaker: 一個簡單易用的換臉工具 基于insightface開發&#xff0c;可以輕松替換視頻或圖片中的人臉。支持windows和linux系統&#xff0c;CPU和GPU推理。onnxruntime推理&#xff0c;無需pytorch。 更新 2023/9/16 更新動作遷移算法2023/9/14 更新臉部增強算法(GFPGAN)和超分…

TypeScript枚舉

1、數字枚舉 enum Direction {Up,Down,Left,Right, } var Direction; (function (Direction) {Direction[Direction["Up"] 0] "Up";Direction[Direction["Down"] 1] "Down";Direction[Direction["Left"] 2] "L…

[點云分割] 基于顏色的區域增長分割

效果&#xff1a; 代碼&#xff1a; #include <iostream> #include <thread> #include <vector>#include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/search/search.h> #include <pcl/search/kdtree.h> #inclu…

AR道具特效制作工具

AR&#xff08;增強現實&#xff09;技術已經逐漸滲透到各個行業&#xff0c;為企業帶來了全新的營銷方式和用戶體驗。在這個背景下&#xff0c;美攝科技憑借其強大的技術實力和創新精神&#xff0c;推出了一款專為企業打造的美攝AR特效制作工具&#xff0c;旨在幫助企業輕松實…

MIKE水動力筆記19_統計平均潮差

本文目錄 前言Step 1 ArcGIS中創建漁網點Step 2 將dfsu數據提取到漁網點Step 3 Python統計平均潮差 前言 日平均潮差&#xff08;average daily tidal range&#xff09;&#xff1a;日高潮潮高合計之和除以實有高潮個數為日平均高潮潮高&#xff0c;日低潮潮高合計之和除以實…

Quartz .Net 的簡單使用

參考了&#xff1a;c# .net framework 4.5.2 , Quartz.NET 3.0.7 - runliuv - 博客園 (cnblogs.com) https://www.cnblogs.com/personblog/p/11277527.html&#xff0c; Quartz.NET 作業調度&#xff08;一&#xff09;&#xff1a;Test - 簡書 自己要輪詢的任務&#xff1a…

NX二次開發UF_CAM_PREPRO_init_module 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_PREPRO_init_module Defined in: uf_cam_prepro.h int UF_CAM_PREPRO_init_module(void ) overview 概述 Initializes the required environment for this module. 初始化此…

淺談Python裝飾器原理與用法分析

前言 本文實例講述了Python裝飾器原理與用法。分享給大家供大家參考&#xff0c;具體如下&#xff1a; 1、裝飾器的本質是函數&#xff0c;主要用來裝飾其他函數&#xff0c;也就是為其他函數添加附加功能 2、裝飾器的原則: (1) 裝飾器不能修改被裝飾的函數的源代碼 (2) 裝…

VScode調試沒有反應

點擊調試按鈕后沒反應 有可能是vscode中安裝的python插件版本問題 可以通過重新安裝比較舊一點的python嘗試解決此問題 步驟如下&#xff1a; 然后從中選擇比當前版本更低的版本即可 安裝完成后需重啟vscode

初識EasyAR

EasyAR 一、介紹&#xff08;核心還是 目標圖像的屏占比&#xff09; 支持 EasyAR-AR|AR技術|AR SDK|Unity AR|下載 1.表面、圖片(靜止/運動)跟蹤&#xff0c;支持多目標 2.3D物體(靜止/運動)跟蹤(注&#xff1a;物體旋轉、遠近移動也可以&#xff0c;本人試過&#xff0c;…

縱享雙創盛宴 “之江創客”再創電商新輝煌

消費日報網訊&#xff08;記者 牛夏風&#xff09;營造良好電商雙創生態&#xff0c;集聚電商發展新勢能。10月31日&#xff0c;以“開放、連接、協同、賦能”為主題的“之江創客”2023全球電子商務創業創新大賽總決賽暨頒獎典禮在湖州南潯圓滿落幕。 記者從現場獲悉&#xff…

SQL 中的 MIN 和 MAX 以及常見函數詳解及示例演示

SQL MIN() 和 MAX() 函數 SQL中的MIN()函數和MAX()函數用于查找所選列的最小值和最大值&#xff0c;分別。以下是它們的用法和示例&#xff1a; MIN() 函數 MIN()函數返回所選列的最小值。 示例&#xff1a; 查找Products表中的最低價格&#xff1a; SELECT MIN(Price) F…

js 獲取當前窗口顯示的放大比例

可以獲取當前窗口顯示的放大比例&#xff0c;也稱為設備像素比 (devicepixelratio) 。這通常用于處理高DPI (高分辨率)屏幕上的視圖縮放。您可以使用window.devicePixelRatio 屬性來獲得當前設備像素比。 以下是一個簡單的JavaScript示例&#xff0c;演示如何獲取設備像素比: j…

基于獼猴Spike運動解碼的不同解碼方法性能對比

公開數據集中文版詳細描述 參考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神經元Spike信號分析 參考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神經元運動調制分析 …

2023 年戴森設計大獎得主是誰?給大樓降溫、爭取救援機會

2023 年戴森設計大獎得主是誰&#xff1f;給大樓降溫、爭取救援機會 ?編輯拉風的極客2023/11/22 摘要 當今社會除了持續不斷對科技創新保持注目&#xff0c;還有很多年輕發明家為了實際場景的難題提供解決方案。 11 月 15 日&#xff0c;2023 年戴森設計大獎國際大獎名單正…

Doris DDL和DML

1 創建用戶和數據庫 1)創建test用戶 mysql -h hadoop1 -P 9030 -uroot -p create user test identified by test; 2)創建數據庫 create database test_db; 3)用戶授權

2023年危險化學品生產單位安全生產管理人員證模擬考試題庫及危險化學品生產單位安全生產管理人員理論考試試題

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2023年危險化學品生產單位安全生產管理人員證模擬考試題庫及危險化學品生產單位安全生產管理人員理論考試試題是由安全生產模擬考試一點通提供&#xff0c;危險化學品生產單位安全生產管理人員證模擬考試題庫是根據危…

文件的原理和應用

常識: 1 文件包括屬性和內容 2 文件有打開和未打開文件&#xff0c; 3 本文先討論誰打開的文件&#xff0c;以及如何管理已經打開的文件 一 回憶c接口 1 fopen 我們在test.c里面用一下fopen函數&#xff0c;不存在打開的文件會默認創建&#xff0c;那為什么默認新建在當前…

【Kettle實戰】字符串處理及網絡請求JSON格式處理

經過大量的kettle操作實踐&#xff0c;我們會漸漸掌握一些技巧&#xff0c;大大減輕清洗的工作量。比如在哪里 處理字符串更方便&#xff0c;在哪兒處理更合理都是一個取舍問題。 字符串拼接 MySQL中使用concat(字段1,字段2)&#xff0c;但是如果“字段2”為NULL&#xff0c;結…