提交 9c28d4d1 创建 作者: 宋海霞's avatar 宋海霞

modify

上级 a16a8805
#ifndef FIRST_H_ #ifndef FIRST_H_
#define FIRST_H_ #define FIRST_H_
// //
// 在此处包含 C 标准库头文件 // 在此处包含 C 标准库头文件
// //
#include <stdio.h> #include <stdio.h>
// //
// 在此处包含其他头文件 // 在此处包含其他头文件
// //
// //
// 在此处定义数据结构 // 在此处定义数据结构
// //
#define MAX_STR_LENGTH 64 #define MAX_STR_LENGTH 64
struct _Rule; struct _Rule;
typedef struct _RuleSymbol{ typedef struct _RuleSymbol
{
struct _RuleSymbol* pNextSymbol; // 指向下一个 Symbol struct _RuleSymbol* pNextSymbol; // 指向下一个 Symbol
int isToken; // 是否为终结符。1 表示终结符,0 表示非终结符 int isToken; // 是否为终结符。1 表示终结符,0 表示非终结符
char SymbolName[MAX_STR_LENGTH]; // 终结符和非终结符的名称 char SymbolName[MAX_STR_LENGTH]; // 终结符和非终结符的名称
}RuleSymbol; }RuleSymbol;
typedef struct _Rule{ typedef struct _Rule
{
char RuleName[MAX_STR_LENGTH]; // 文法的名称 char RuleName[MAX_STR_LENGTH]; // 文法的名称
struct _RuleSymbol* pFirstSymbol;// 指向文法的第一个 Symbol struct _RuleSymbol* pFirstSymbol;// 指向文法的第一个 Symbol
struct _Rule* pNextRule; // 指向下一条文法 struct _Rule* pNextRule; // 指向下一条文法
}Rule; }Rule;
typedef struct _Set{ typedef struct _Set
{
char Name[MAX_STR_LENGTH]; // 集合的名称 char Name[MAX_STR_LENGTH]; // 集合的名称
char Terminal[32][MAX_STR_LENGTH];// 终结符数组 char Terminal[32][MAX_STR_LENGTH];// 终结符数组
int nTerminalCount; // 数组元素个数 int nTerminalCount; // 数组元素个数
}Set; }Set;
typedef struct _SetList{ typedef struct _SetList
{
Set Sets[32]; // 集合数组 Set Sets[32]; // 集合数组
int nSetCount; // 数组元素个数 int nSetCount; // 数组元素个数
}SetList; }SetList;
...@@ -67,7 +66,6 @@ void PrintRule(const Rule* pHead); ...@@ -67,7 +66,6 @@ void PrintRule(const Rule* pHead);
void PrintFirstSet(SetList* pFirstSetList); void PrintFirstSet(SetList* pFirstSetList);
// //
// 在此声明全局变量 // 在此声明全局变量
// //
......
...@@ -157,12 +157,14 @@ void First(const Rule* pHead, SetList* pFirstSetList) ...@@ -157,12 +157,14 @@ void First(const Rule* pHead, SetList* pFirstSetList)
} }
typedef struct _SYMBOL{ typedef struct _SYMBOL
{
int isToken; int isToken;
char SymbolName[MAX_STR_LENGTH]; char SymbolName[MAX_STR_LENGTH];
}SYMBOL; }SYMBOL;
typedef struct _RULE_ENTRY{ typedef struct _RULE_ENTRY
{
char RuleName[MAX_STR_LENGTH]; char RuleName[MAX_STR_LENGTH];
SYMBOL Symbols[64]; SYMBOL Symbols[64];
}RULE_ENTRY; }RULE_ENTRY;
...@@ -204,17 +206,17 @@ Rule* InitRules() ...@@ -204,17 +206,17 @@ Rule* InitRules()
int i, j; int i, j;
Rule** pRulePtr = &pHead; Rule** pRulePtr = &pHead;
for(i=0; i<nRuleCount; i++) for (i=0; i<nRuleCount; i++)
{ {
*pRulePtr = CreateRule(rule_table[i].RuleName); *pRulePtr = CreateRule(rule_table[i].RuleName);
pRulePtr = &(*pRulePtr)->pNextRule; pRulePtr = &(*pRulePtr)->pNextRule;
} }
pRule = pHead; pRule = pHead;
for(i=0; i<nRuleCount; i++) for (i=0; i<nRuleCount; i++)
{ {
pSymbolPtr = &pRule->pFirstSymbol; pSymbolPtr = &pRule->pFirstSymbol;
for(j=0; rule_table[i].Symbols[j].SymbolName[0] != '\0'; j++) for (j=0; rule_table[i].Symbols[j].SymbolName[0] != '\0'; j++)
{ {
const SYMBOL* pSymbol = &rule_table[i].Symbols[j]; const SYMBOL* pSymbol = &rule_table[i].Symbols[j];
...@@ -243,18 +245,18 @@ Rule* InitRules_CI() ...@@ -243,18 +245,18 @@ Rule* InitRules_CI()
{ {
int nRuleCount = 0; int nRuleCount = 0;
// 需要读取多行文本 // 需要读取多行文本
for(int i = 0; i < 20; i++) for (int i = 0; i < 20; i++)
{ {
gets(rule_table_ci[i]); gets(rule_table_ci[i]);
int length = strlen(rule_table_ci[i]); int length = strlen(rule_table_ci[i]);
if(length == 0) if (length == 0)
{ {
break; break;
} }
for(int j = 0; j < length; j++) for (int j = 0; j < length; j++)
{ {
if(rule_table_ci[i][j] == ' ') if (rule_table_ci[i][j] == ' ')
{ {
ruleNameArr[i][j] = '\0'; ruleNameArr[i][j] = '\0';
break; break;
...@@ -268,21 +270,21 @@ Rule* InitRules_CI() ...@@ -268,21 +270,21 @@ Rule* InitRules_CI()
RuleSymbol **pSymbolPtr, *pNewSymbol; RuleSymbol **pSymbolPtr, *pNewSymbol;
Rule** pRulePtr = &pHead; Rule** pRulePtr = &pHead;
for(int i=0; i<nRuleCount; i++) for (int i=0; i<nRuleCount; i++)
{ {
*pRulePtr = CreateRule(ruleNameArr[i]); *pRulePtr = CreateRule(ruleNameArr[i]);
pRulePtr = &(*pRulePtr)->pNextRule; pRulePtr = &(*pRulePtr)->pNextRule;
} }
pRule = pHead; pRule = pHead;
for(int i=0; i<nRuleCount; i++) for (int i=0; i<nRuleCount; i++)
{ {
pSymbolPtr = &pRule->pFirstSymbol; pSymbolPtr = &pRule->pFirstSymbol;
int start = 0; int start = 0;
for(int j=0; rule_table_ci[i][j] != '\0'; j++) for (int j=0; rule_table_ci[i][j] != '\0'; j++)
{ {
if(rule_table_ci[i][j] == ' ' if (rule_table_ci[i][j] == ' '
&& rule_table_ci[i][j + 1] == '-' && rule_table_ci[i][j + 1] == '-'
&& rule_table_ci[i][j + 2] == '>' && rule_table_ci[i][j + 2] == '>'
&& rule_table_ci[i][j + 3] == ' ') && rule_table_ci[i][j + 3] == ' ')
...@@ -292,9 +294,9 @@ Rule* InitRules_CI() ...@@ -292,9 +294,9 @@ Rule* InitRules_CI()
} }
} }
for(int k=start; rule_table_ci[i][k] != '\0'; k++) for (int k=start; rule_table_ci[i][k] != '\0'; k++)
{ {
if(rule_table_ci[i][k] == ' ') if (rule_table_ci[i][k] == ' ')
{ {
continue; continue;
} }
...@@ -302,9 +304,9 @@ Rule* InitRules_CI() ...@@ -302,9 +304,9 @@ Rule* InitRules_CI()
pNewSymbol = CreateSymbol(); pNewSymbol = CreateSymbol();
char tokenName[MAX_STR_LENGTH] = {}; char tokenName[MAX_STR_LENGTH] = {};
for(int m = 0; ;m++) for (int m = 0; ;m++)
{ {
if(rule_table_ci[i][k] == ' ' || rule_table_ci[i][k] == '\0' || rule_table_ci[i][k] == '\n') if (rule_table_ci[i][k] == ' ' || rule_table_ci[i][k] == '\0' || rule_table_ci[i][k] == '\n')
{ {
tokenName[m] = '\0'; tokenName[m] = '\0';
break; break;
...@@ -317,9 +319,9 @@ Rule* InitRules_CI() ...@@ -317,9 +319,9 @@ Rule* InitRules_CI()
strcpy(pNewSymbol->SymbolName, tokenName); strcpy(pNewSymbol->SymbolName, tokenName);
pNewSymbol->isToken = 1; pNewSymbol->isToken = 1;
for(int n = 0; n < nRuleCount; n++) for (int n = 0; n < nRuleCount; n++)
{ {
if(strcmp(pNewSymbol->SymbolName, ruleNameArr[n]) == 0) if (strcmp(pNewSymbol->SymbolName, ruleNameArr[n]) == 0)
{ {
pNewSymbol->isToken = 0; pNewSymbol->isToken = 0;
break; break;
...@@ -403,12 +405,12 @@ void PrintRule(const Rule* pHead) ...@@ -403,12 +405,12 @@ void PrintRule(const Rule* pHead)
void PrintFirstSet(SetList* pFirstSetList) void PrintFirstSet(SetList* pFirstSetList)
{ {
printf("\nThe First Set:\n"); printf("\nThe First Set:\n");
for(int i = 0; i < pFirstSetList->nSetCount; i++) for (int i = 0; i < pFirstSetList->nSetCount; i++)
{ {
printf("First(%s) = { ", pFirstSetList->Sets[i].Name); printf("First(%s) = { ", pFirstSetList->Sets[i].Name);
for(int j = 0; j < pFirstSetList->Sets[i].nTerminalCount; j++) for (int j = 0; j < pFirstSetList->Sets[i].nTerminalCount; j++)
{ {
if(j == pFirstSetList->Sets[i].nTerminalCount - 1) if (j == pFirstSetList->Sets[i].nTerminalCount - 1)
{ {
printf("%s ", pFirstSetList->Sets[i].Terminal[j]); printf("%s ", pFirstSetList->Sets[i].Terminal[j]);
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论