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

modify

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