亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
亚洲欧洲一区二区在线播放| 国产亚洲福利社区一区| 久久这里只精品最新地址| 亚洲精品你懂的| 国产很黄免费观看久久| 欧美亚洲免费在线一区| 日韩午夜在线影院| 亚洲精品免费在线播放| 国精产品一区一区三区mba视频 | 欧美不卡一区二区三区四区| 亚洲午夜av在线| 91美女片黄在线| 亚洲综合无码一区二区| 欧美亚洲国产一区在线观看网站| 天堂一区二区在线| 日韩免费视频一区| 国产成人一级电影| 久久久国产精华| 国产黑丝在线一区二区三区| xf在线a精品一区二区视频网站| 日本不卡视频一二三区| 久久无码av三级| 高清av一区二区| 亚洲欧洲韩国日本视频 | 国产调教视频一区| 99久久99久久精品国产片果冻| 久久久久免费观看| 99精品在线免费| 一区二区三区四区蜜桃| 欧美裸体bbwbbwbbw| 美女一区二区视频| 久久久国产精品午夜一区ai换脸| 99视频有精品| 国产一区二区视频在线播放| 亚洲一区二区欧美日韩| 国产欧美一区视频| 欧美男生操女生| 99re热视频这里只精品| 国产乱码精品一区二区三区五月婷| 亚洲色图视频网| 欧美一区二区视频在线观看2020 | 极品销魂美女一区二区三区| 亚洲精品伦理在线| 色综合色综合色综合 | 欧美日韩精品电影| 国产91丝袜在线播放| 午夜精品久久久久久久99樱桃| 欧美国产一区在线| 欧美电影免费观看高清完整版| 精品亚洲porn| 美女久久久精品| 亚洲国产精华液网站w| 欧美疯狂做受xxxx富婆| 成人免费视频一区| 激情都市一区二区| 免费成人美女在线观看.| 国产欧美日韩在线观看| 日韩视频一区二区在线观看| 91久久线看在观草草青青| 国产在线视频一区二区| 亚洲电影视频在线| 一区二区欧美精品| 亚洲三级在线免费| 国产精品三级电影| 久久这里只精品最新地址| 日韩片之四级片| 欧美精品高清视频| 欧美日韩国产123区| 69堂国产成人免费视频| 久久综合色鬼综合色| 欧美激情综合在线| 午夜精品免费在线观看| 亚洲国产成人av网| 国产精品99久久久久| 91福利国产成人精品照片| 欧美一区二区在线视频| 久久精品一区八戒影视| 亚洲一区二区三区四区中文字幕| 六月丁香婷婷久久| 91蜜桃在线免费视频| 精品福利视频一区二区三区| 亚洲男人电影天堂| 国产一区二区三区综合| 一本一本大道香蕉久在线精品| 日韩一区二区视频| 亚洲色图一区二区| 国产一区二区三区不卡在线观看| 欧美亚洲国产一区在线观看网站| 国产精品国产三级国产普通话99 | 国产精品久久久爽爽爽麻豆色哟哟| 亚洲精品一二三| 麻豆成人综合网| 不卡的av电影| 国产精品午夜春色av| 偷拍亚洲欧洲综合| 95精品视频在线| 久久久www成人免费无遮挡大片| 亚洲午夜av在线| 色欧美88888久久久久久影院| 中文字幕一区二区三区在线不卡| 狠狠色丁香久久婷婷综合_中| 欧美人伦禁忌dvd放荡欲情| 亚洲免费观看高清完整版在线观看熊 | 美女在线视频一区| 日韩一区二区免费在线观看| 奇米色一区二区| 制服丝袜日韩国产| 久久国产精品一区二区| 精品国产乱码久久久久久久久 | 青娱乐精品视频在线| 91浏览器入口在线观看| 国产精品无圣光一区二区| 国产乱码精品一区二区三 | 91视频免费观看| 亚洲第一狼人社区| 欧美日韩高清影院| 亚洲 欧美综合在线网络| 欧美调教femdomvk| 久久国产精品色| 国产午夜一区二区三区| 成熟亚洲日本毛茸茸凸凹| 久久久亚洲午夜电影| 色天使久久综合网天天| 性做久久久久久久免费看| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品一区二区视频| 国产女人18水真多18精品一级做| 成人性生交大片免费看视频在线| 欧美韩国日本不卡| 欧美日韩久久一区| 国产美女视频一区| 中文字幕第一页久久| 国产乱妇无码大片在线观看| 国产精品入口麻豆九色| 欧美亚洲高清一区二区三区不卡| 久久不见久久见免费视频7| 亚洲国产精品成人综合色在线婷婷 | 一区二区三区在线观看网站| 久久免费看少妇高潮| 在线精品视频免费观看| 国产成人夜色高潮福利影视| 天天射综合影视| 亚洲欧美日韩国产成人精品影院| 7777精品伊人久久久大香线蕉最新版| 久久亚洲欧美国产精品乐播| 精品无人码麻豆乱码1区2区 | 欧美亚洲一区二区在线| 国产.精品.日韩.另类.中文.在线.播放| 国产精品福利一区| 中文字幕不卡的av| 久久久久亚洲综合| 欧美日高清视频| 91啪在线观看| 在线精品视频免费观看| av成人免费在线观看| 国内外成人在线| 国产精品一区二区果冻传媒| 国产成人一区二区精品非洲| 国产91丝袜在线播放九色| 成人午夜激情视频| 91在线观看一区二区| 91蜜桃婷婷狠狠久久综合9色| 91欧美一区二区| 日本高清免费不卡视频| 91成人网在线| 欧美日韩精品久久久| 日韩女优av电影在线观看| 欧美日韩小视频| 欧美色精品在线视频| 欧美性一级生活| 精品日产卡一卡二卡麻豆| 久久综合九色综合欧美亚洲| 丰满岳乱妇一区二区三区| 男男视频亚洲欧美| 亚洲永久免费av| 久久aⅴ国产欧美74aaa| 美女一区二区久久| 成人成人成人在线视频| 国产精品99久久久久久久vr | 国产偷v国产偷v亚洲高清| 亚洲欧美综合另类在线卡通| 1区2区3区精品视频| 日韩av在线播放中文字幕| 久久www免费人成看片高清| 高清成人免费视频| 成人精品一区二区三区四区| 精品视频在线看| 欧美高清视频在线高清观看mv色露露十八 | 久久理论电影网| 亚洲午夜激情av| 欧美怡红院视频| 日韩一区有码在线| 九色|91porny| 精品国产欧美一区二区| 热久久免费视频| 精品中文字幕一区二区| 91精品在线麻豆| 丝袜美腿亚洲综合| 在线观看视频欧美| 国产精品色呦呦|