亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? syntax.cpp

?? Cool語言編譯器
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
////////////////////////////////////////////////
//                                            //
//    Syntax.cpp                              //
//    語法檢查模塊                            //
//    處理整個程序或單個語句語法檢查的請求    //
//    最后更新時間:2004年4月23日11:35        //
//                                            //
////////////////////////////////////////////////



#include <string.h>
#include <ctype.h>

#include "Syntax.h"

void CheckSyntax()
{
	// 檢查程序的語法

	// 當前行語句的副本
	char Line[MaxY];

	for (int i = 0; i <= EndLine; i++)
	{
		// 得到語句行的副本
		strcpy(Line, Text[i]->Line);

		// 清除前后空格
		ClearHeadBlank(Line);
		ClearTailBlank(Line);

		// 檢查該行
		Error = CheckLine(Line);

		if (Error != NoError)
		{
			// 發現語法錯誤

			// 顯示語法錯誤
			ShowError(Error, i, "");

			return;
		}
	}
}

ErrorType CheckLine(const char strLineIn[MaxY])
{
	char strLine[MaxY];
	strcpy(strLine, strLineIn);
	ClearHeadBlank(strLine);
	ClearTailBlank(strLine);

	if (strLine[0] == '\0')
	{
		// 空行

		// 返回無錯誤
		return NoError;
	}

	// 存儲首字符串
	char Cmd[MaxY];

	// 得到首字符串
	GetPart(strLine, 1, ' ', Cmd);

	if (strcmp(Cmd, "REM") == 0)
	{
		// 注釋行,跳過語法檢查
	}
	else if (strcmp(Cmd, "CLS") == 0
		|| strcmp(Cmd, "CONTINUE") == 0
		|| strcmp(Cmd, "BREAK") == 0
		|| strcmp(Cmd, "EXIT") == 0
		|| strcmp(Cmd, "ELSE") == 0)
	{
		// 單命令語句

		// 得到其尾字符串
		char Tail[MaxY];
		GetPart(strLine,2,' ', Tail);

		if (Tail[0] != '\0')
		{
			// 有尾巴

			// 有多余部分
			return ErrorUnwantedPart;
		}
	}
	else if (strcmp(Cmd, "DIM") == 0)
	{
		// DIM語句

		// 得到變量名
		char Var[MaxY];
		GetPart(strLine, 2, ' ', Var);

		if (Var[0] == '\0')
		{
			return ErrorMissingVar;
		}

		if (!VarOK(Var))
		{
			// 變量名錯誤

			return Error;
		}

		// 檢查AS關鍵字
		char Part[MaxY];
		GetPart(strLine, 3, ' ', Part);
		if (strcmp(Part, "AS") != 0)
		{
			// 缺少AS

			return ErrorMissingAS;
		}

		// 檢查類型描述
		char Type[MaxY];
		GetPart(strLine, 4, ' ', Type);
		if (strcmp(Type, "INTEGER") != 0
			&& strcmp(Type, "REAL") != 0
			&& strcmp(Type, "STRING") != 0
			&& strcmp(Type, "ARRAY") != 0)
		{
			// 未知類型

			return ErrorMissingVarType;
		}

		// 得到尾部
		char Tail[MaxY];
		GetBack(strLine, 4, ' ', Tail);

		if (Tail[strlen(Tail) - 1] == ',')
		{
			// 尾部有多余逗號
			return ErrorUnwantedComma;
		}

		if (strcmp(Type, "ARRAY") == 0)
		{
			// 是數組類型

			if (Tail[0] != '\0')
			{
				// 檢查每一維是否合法

				char Range[MaxY];
				strcat(Tail, ",");
				GetPart(Tail, 1, ',', Range);
				ClearHeadBlank(Range);

				int i = 1;
				while (Range[0] != '\0')
				{
					if (!ExpressionOK(Range))
					{
						// 關于維數的表達式錯誤

						return ErrorExpression;
					}

					i++;
					GetPart(Tail, i, ',', Range);
					ClearHeadBlank(Range);
				}
			}
			else
			{
				// 缺少數組的具體大小

				return ErrorMissingArraySize;
			}
		}
		else if ( Tail[0] != '\0')
		{
			// 有尾巴

			return ErrorUnwantedPart;
		}
	}
	else if (strcmp(Cmd, "INPUT") == 0)
	{
		// 檢查INPUT語句

		// 存儲變量
		char Var[MaxY];
		GetBack(strLine, 1, ' ', Var);
		ClearBlankInside(Var);

		if (!VarOK(Var))
		{
			return Error;
		}
	}
	else if (strcmp(Cmd, "PRINT") == 0)
	{
		// 檢查PRINT語句

		// 存儲打印序列
		char PrintList[MaxY];
		GetBack(strLine, 1, ' ', PrintList);

		char Part[MaxY] = "";

		for (int i = 0; i <= strlen(PrintList); i++)
		{
			// 掃描打印序列

			if (PrintList[i] == ';' || i == strlen(PrintList))
			{
				// 一個打印元素掃描完成

				if (Part[0] != '\0')
				{
					if (!ExpressionOK(Part))
					{
						return ErrorExpression;
					}
					Part[0] = '\0';
				}
			}
			else if (PrintList[i] == '"')
			{
				// 字符串的開始

				// 找字符串的末尾
				do
				{
					i++;
				} while (i < strlen(PrintList) && PrintList[i] != '"');

				if (i == strlen(PrintList))
				{
					// 字符串缺少結束引號

					return ErrorQuotation;
				}

				do
				{
					i++;
					if (i < strlen(PrintList) &&
						PrintList[i] != ' ' && PrintList[i] != ';')
					{
						return ErrorPrintSeparate;
					}
				} while (i < strlen(PrintList) && PrintList[i] != ';');
				i++;
			}
			else if (PrintList[i] != ' ')
			{
				// 當前字符非空,加如打印元素

				strcat(Part, " ");
				Part[strlen(Part) - 1] = PrintList[i];
			}
		}
	}
	else if (strcmp(Cmd, "GOSUB") == 0 || strcmp(Cmd, "SUB") == 0)
	{
		// 檢查GOSUB和SUB語句

		// 存儲過程名
		char Var[MaxY];
		GetPart(strLine, 2, ' ', Var);

		if (!VarOK(Var))
		{
			// 過程名非法

			return ErrorSubName;
		}

		// 檢查尾部部分
		char Tail[MaxY];
		GetPart(strLine, 3, ' ', Tail);
		if (Tail [0] != '\0')
		{
			// 有多余部分

			return ErrorUnwantedPart;
		}
	}
	else if (strcmp(Cmd, "FOR") == 0)
	{
		// 檢查FOR語句

		// 當前行的長度
		int Len = strlen(strLine);

		// 分段部分的參數
		char *ptr1;
		if ((ptr1 = strstr(strLine, " = ")) == NULL)
		{
			// FOR語句缺少變量賦值

			return ErrorMissingForVarGiveValue;
		}

		char *ptr2;
		if ((ptr2 = strstr(strLine, " TO ")) == NULL)
		{
			// FOR語句缺少TO

			return ErrorMissingTO;
		}

		char *ptr3;
		ptr3 = strstr(strLine, " STEP ");

		char strTemp[MaxY];

		// 檢查循環變量
		GetMid(strLine, 4, Len - strlen(ptr1) - 1, strTemp);
		ClearBlankInside(strTemp);
		if (!VarOK(strTemp))
		{
			// 循環變量錯誤

			return Error;
		}

		// 檢查初值部分表達式
		GetMid(strLine, Len - strlen(ptr1) + 3, Len - strlen(ptr2) - 1, strTemp);
		ClearBlankInside(strTemp);
		if (!ExpressionOK(strTemp))
		{
			// 表達式錯誤

			return ErrorExpression;
		}

		// 檢查終值部分表達式
		if (ptr3 == NULL)
		{
			GetMid(strLine, Len - strlen(ptr2) + 4, Len, strTemp);
		}
		else
		{
			GetMid(strLine, Len - strlen(ptr2) + 4, Len - strlen(ptr3) - 1, strTemp);
		}

		ClearBlankInside(strTemp);
		if (!ExpressionOK(strTemp))
		{
			// 表達式錯誤

			return ErrorExpression;
		}

		// 檢查步長值部分表達式
		if (ptr3 != NULL)
		{
			GetMid(strLine, Len - strlen(ptr3) + 6, Len, strTemp);
			ClearBlankInside(strTemp);
			if (!ExpressionOK(strTemp))
			{
				// 表達式錯誤

				return ErrorExpression;
			}
		}
	}
	else if (strcmp(Cmd, "NEXT") == 0)
	{
		// 檢查NEXT語句

		// 存儲變量名
		char Var[MaxY];
		GetPart(strLine, 2, ' ', Var);
		if (Var[0] != '\0')
		{
			if (!VarOK(Var))
			{
				// 變量錯誤

				return Error;
			}
		}
	}
	else if (strcmp(Cmd, "IF") == 0)
	{
		// 檢查IF語句

		// 檢查末尾關鍵字THEN
		char Part[MaxY];
		GetMid(strLine, strlen(strLine) - 4, strlen(strLine) - 1, Part);
		if (strcmp(Part, "THEN") != 0)
		{
			// 缺少THEN

			return ErrorUnwantedPart;
		}

		// 檢查布爾表達式
		GetMid(strLine, 3, strlen(strLine) - 6, Part);

		char Exp[MaxY];
		BoolChange(Part, Exp);
		if (!BooleanOK(Exp))
		{
			// 布爾表達式錯誤

			return ErrorBool;
		}
	}
	else if (strcmp(Cmd, "DELAY") == 0)
	{
		// 檢查DELAY語句

		// 檢查表達式
		char Part[MaxY];
		GetPart(strLine, 2, ' ', Part);
		ClearBlankInside(Part);

		if (!ExpressionOK(Part))
		{
			// 表達式錯誤

			return ErrorExpression;
		}
	}
	else if (strcmp(Cmd, "LOCATE") == 0)
	{
		// 檢查LOCATE語句

		// 存儲參數部分
		char Temp[MaxY] = "";
		GetBack(strLine, 1, ' ', Temp);

		char Part[MaxY];

		// 檢查2個參數
		for (int i = 1; i <= 2; i++)
		{
			GetPart(Temp, i, ',', Part);
			ClearBlankInside(Part);

			if (Part[0] == '\0')
			{
				return ErrorMissingExpression;
			}

			if (!ExpressionOK(Part))
			{
				// 表達式錯誤

				return ErrorExpression;
			}
		}
	}
	else if (strcmp(Cmd, "END") == 0)
	{
		// 檢查END語句

		// 檢查后面的關鍵字
		char Part[MaxY];
		GetPart(strLine, 2, ' ', Part);
		if (Part[0] != '\0' && strcmp(Part, "IF") != 0 && strcmp(Part, "SUB") != 0)
		{
			// 不為空,且不是IF和SUB,錯誤

			return ErrorUnwantedPart;
		}
	}
	else if (strcmp(Cmd, "DELETE") == 0)
	{
		// 檢查DELETE語句

		// 存儲變量列表
		char VarList[MaxY];
		GetBack(strLine, 1, ' ', VarList);
		ClearBlankInside(VarList);

		if (VarList[strlen(VarList) - 1] == ',')
		{
			// 列表后有多余的逗號

			return ErrorUnwantedComma;
		}

		int i = 1;

		// 存儲變量名
		char Var[MaxY];
		GetPart(VarList, 1, ',', Var);

		while (Var[0] != '\0')
		{
			if (strchr(Var, '('))
			{
				return ErrorCannotDelArray;
			}
			else if (!VarOK(Var))
			{
				// 變量名錯誤

				return ErrorVar;
			}

			// 得到下一個變量名
			i++;
			GetPart(VarList, i, ',', Var);
		}

		if (i == 1)
		{
			// 需要變量名

			return ErrorMissingVar;
		}
	}
	else
	{
		// 檢查賦值語句

		char *ptr = strstr(strLine, " = ");
		if (ptr != NULL)
		{
			// 有賦值號

			// 存儲賦值號的開始位置
			int Pos = strlen(strLine) - strlen(ptr);

			// 存儲變量
			char Var[MaxY];
			GetMid(strLine, 0, Pos - 1, Var);

			if (strchr(Var, '('))
			{
				// 是數組變量

				// 存儲下標部分
				char Para[MaxY];
				GetPart(Var, 2, '(', Para);
				Para[strlen(Para) - 1] = '\0';
				ClearTailBlank(Para);

				if (Para[strlen(Para) - 1] == ',')
				{
					// 有多余的逗號

					return ErrorUnwantedComma;
				}

				// 檢查數組的每一個下標
				char Range[MaxY];
				strcat(Para, ",");
				GetPart(Para, 1, ',', Range);
				ClearBlankInside(Range);

				int i = 1;
				while (Range[0] != '\0')
				{
					if (!ExpressionOK(Range))
					{
						// 表達式錯誤

						return ErrorExpression;
					}

					// 得到下一個下標
					i++;
					GetPart(Para, i, ',', Range);
					ClearBlankInside(Range);
				}

				if (i == 1)
				{
					// 缺少下標

					return ErrorMissingSubscript;
				}
			}
			else if (!VarOK(Var))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美另类变人与禽xxxxx| 成人短视频下载| 香蕉av福利精品导航 | 欧美aaaaa成人免费观看视频| 亚洲美女屁股眼交3| 亚洲欧美一区二区视频| 亚洲图片你懂的| 亚洲人成精品久久久久久| **性色生活片久久毛片| 一区二区三区在线不卡| 亚洲国产精品久久人人爱| 无码av中文一区二区三区桃花岛| 亚洲成人7777| 蜜臀av在线播放一区二区三区| 奇米一区二区三区| 黑人巨大精品欧美黑白配亚洲| 国产另类ts人妖一区二区| 国产suv精品一区二区三区| 99久久综合色| 欧美喷潮久久久xxxxx| 日韩欧美你懂的| 国产日韩欧美精品综合| 亚洲另类春色国产| 日本中文在线一区| 大胆欧美人体老妇| 日本高清视频一区二区| 欧美成人一区二区| 国产精品久久久久久久蜜臀| 亚洲午夜av在线| 国产一区二区91| 在线观看欧美精品| 精品国产乱码久久久久久影片| 国产精品免费视频网站| 视频一区视频二区在线观看| 国产不卡在线一区| 欧美日韩mp4| 中文字幕欧美日本乱码一线二线| 夜夜精品视频一区二区| 国产麻豆一精品一av一免费| 91国产丝袜在线播放| 久久精品男人天堂av| 偷窥少妇高潮呻吟av久久免费 | 国产精品美女久久久久久 | 日本美女一区二区三区视频| 国产在线精品国自产拍免费| 在线影院国内精品| 中文字幕在线一区二区三区| 捆绑紧缚一区二区三区视频| 色综合天天视频在线观看| 久久网站最新地址| 亚洲图片欧美一区| 99国产一区二区三精品乱码| 2024国产精品视频| 免费观看91视频大全| 欧美影视一区二区三区| 亚洲视频小说图片| 从欧美一区二区三区| 26uuu精品一区二区| 麻豆精品国产91久久久久久| 日本丶国产丶欧美色综合| 国产精品久久久久久久久免费丝袜| 日韩av电影免费观看高清完整版在线观看| 成人免费高清在线| 久久久亚洲精品石原莉奈| 人人超碰91尤物精品国产| 欧洲av在线精品| 夜夜精品浪潮av一区二区三区| 不卡的av中国片| 国产精品成人一区二区艾草| 丁香婷婷综合激情五月色| 久久日韩精品一区二区五区| 老司机午夜精品99久久| 日韩限制级电影在线观看| 日韩av一区二区三区四区| 欧美另类videos死尸| 视频一区在线播放| 欧美精品九九99久久| 日本不卡一区二区三区| 6080日韩午夜伦伦午夜伦| 视频一区欧美日韩| 日韩美女在线视频 | 国产欧美精品一区二区色综合| 国产一区二区三区| 国产精品青草综合久久久久99| 成人激情小说网站| 亚洲四区在线观看| 日本高清无吗v一区| 亚洲国产成人av| 日韩精品一区二区三区视频播放 | 国产乱对白刺激视频不卡| 国产亚洲精品超碰| 91一区二区三区在线观看| 亚洲精品ww久久久久久p站| 欧美精品一级二级三级| 久久精品国产99久久6| 国产欧美一区二区精品久导航| 成人动漫精品一区二区| 亚洲国产精品久久一线不卡| 日韩欧美一级精品久久| 懂色av一区二区夜夜嗨| 亚洲综合色噜噜狠狠| 日韩一二三四区| 成人激情视频网站| 亚洲电影在线播放| 久久网站热最新地址| 在线观看网站黄不卡| 精品影院一区二区久久久| 一色屋精品亚洲香蕉网站| 69精品人人人人| 国产成人高清视频| 亚洲高清久久久| 亚洲激情欧美激情| 精品久久久久久久久久久久久久久 | 播五月开心婷婷综合| 三级久久三级久久| 欧美激情一区二区三区不卡 | 免播放器亚洲一区| 中文字幕在线不卡| 精品乱人伦小说| 欧美中文字幕一区| 成人精品gif动图一区| 亚洲444eee在线观看| 综合欧美一区二区三区| 精品日本一线二线三线不卡| 色婷婷一区二区三区四区| 激情六月婷婷综合| 图片区小说区国产精品视频| 《视频一区视频二区| 久久综合久久综合久久| 欧美一区二区三区系列电影| 91在线免费播放| 国产成人av电影在线| 久久国产精品99久久人人澡| 亚洲国产色一区| 椎名由奈av一区二区三区| 国产欧美一区二区精品婷婷| 日韩精品影音先锋| 欧美日韩电影一区| 色视频成人在线观看免| 成人网男人的天堂| 国产电影一区二区三区| 精品一区二区影视| 激情欧美日韩一区二区| 六月丁香婷婷久久| 老司机精品视频在线| 蜜桃av噜噜一区| 人人精品人人爱| 蜜臀av一区二区| 免费成人你懂的| 人人超碰91尤物精品国产| 日韩黄色小视频| 久久国产欧美日韩精品| 精品一区二区三区免费观看| 麻豆精品久久久| 国产一区二区调教| 国产精品一区久久久久| 国产成人午夜精品影院观看视频 | 久久精品一区四区| 久久免费看少妇高潮| 精品成人一区二区| 国产网站一区二区| ㊣最新国产の精品bt伙计久久| 中文字幕在线播放不卡一区| 亚洲色图另类专区| 亚洲午夜免费视频| 日本不卡1234视频| 国产一区二区三区蝌蚪| jlzzjlzz亚洲日本少妇| 在线视频你懂得一区| 精品视频一区三区九区| 日韩丝袜美女视频| 久久精品一区二区三区四区| 国产精品无码永久免费888| 亚洲少妇30p| 午夜影院久久久| 精品一区二区综合| 97se亚洲国产综合在线| 欧美日韩一区二区三区在线看 | 国产在线精品一区二区三区不卡| 国产成人精品一区二区三区网站观看| 欧美高清激情brazzers| 日韩欧美国产综合一区| 国产精品对白交换视频| 日韩精品一级二级| 粉嫩一区二区三区在线看| 欧美伊人久久久久久久久影院| 日韩美女一区二区三区| 亚洲欧美另类图片小说| 免费成人小视频| 色诱视频网站一区| 日韩欧美一区在线| 亚洲美女屁股眼交| 国模套图日韩精品一区二区| 99精品国产91久久久久久| 精品日产卡一卡二卡麻豆| 亚洲在线观看免费| 成人免费电影视频| 精品伦理精品一区| 丝袜亚洲另类欧美| 色一情一乱一乱一91av|