您的位置:首页 > 编程语言 > C语言/C++

C++写一个简单的解析器(分析C语言)

2015-06-17 11:37 573 查看
该方案实现了一个分析C语言的词法分析+解析。

注意:

1.简单语法,部分秕。它可以在本文法的基础上进行扩展,此过程使用自上而下LL(1)语法。

2.自己主动能达到求First 集和 Follow 集。

3.处终结符外(有些硬编码的成分),终结符的文法能够自己定义,也就是说读者能够自己定义文法。

4.为方便理解。C语言的文法描写叙述写成中文。

5.程序将词法分析和语法分析结合起来。词法分析的结果作为语法分析的输入。

6.终于结果在控制台显示的有:词法分析、First集、Follow集、Select集,在preciateResult.txt 中写入了语法分析结果。在preciateTable.txt 中写入了预測分析表。

7.文法的词素之间必须有空格分开。

项目结构例如以下:



文法例如以下:

wenfa.txt:

<函数定义> -> <修饰词闭包> <类型> <变量> ( <參数声明> ) { <函数块> }
<修饰词闭包> -> <修饰词> <修饰词闭包> | $
<修饰词> -> describe
<类型> -> type <取地址>
<取地址> -> <星号闭包>
<星号闭包> -> <星号> <星号闭包> | $
<星号> -> *
<变量> -> <标志符> <数组下标>
<标志符> -> id
<数组下标> -> [ <因式> ] | $
<因式> -> ( <表达式> ) | <变量> | <数字>
<数字> -> digit
<表达式> -> <因子> <项>
<因子> -> <因式> <因式递归>
<因式递归> -> * <因式> <因式递归> | / <因式> <因式递归> | $
<项> -> + <因子> <项> | - <因子> <项> | $
<參数声明> -> <声明> <声明闭包> | $
<声明> -> <修饰词闭包> <类型> <变量> <赋初值>
<赋初值> -> = <右值> | $
<右值> -> <表达式> | { <多个数据> }
<多个数据> -> <数字> <数字闭包>
<数字闭包> -> , <数字> <数字闭包> | $
<声明闭包> -> , <声明> <声明闭包> | $
<函数块> -> <声明语句闭包> <函数块闭包>
<声明语句闭包> -> <声明语句> <声明语句闭包> | $
<声明语句> -> <声明> ;
<函数块闭包> -> <赋值函数> <函数块闭包> | <for循环> <函数块闭包> | <条件语句> <函数块闭包> | <函数返回> <函数块闭包> | $
<赋值函数> -> <变量> <赋值或函数调用>
<赋值或函数调用> -> = <右值> ; | ( <參数列表> ) ;
<參数列表> -> <參数> <參数闭包>
<參数闭包> -> , <參数> <參数闭包> | $
<參数> -> <标志符> | <数字> | <字符串>
<字符串> -> string
<for循环> -> for ( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> }
<逻辑表达式> -> <表达式> <逻辑运算符> <表达式>
<逻辑运算符> -> < | > | == | !=
<后缀表达式> -> <变量> <后缀运算符>
<后缀运算符> -> ++ | --
<条件语句> -> if ( <逻辑表达式> ) { <函数块> } <否则语句>
<否则语句> -> else { <函数块> } | $
<函数返回> -> return <因式> ;


词法分析头文件:
LexAnalysis.h

//LexAnalysis.h
#ifndef _LEXANALYSIS_H
#define _LEXANALYSIS_H

//keyword
#define AUTO 1
#define BREAK 2
#define CASE 3
#define CHAR 4
#define CONST 5
#define CONTINUE 6
#define DEFAULT 7
#define DO 8
#define DOUBLE 9
#define ELSE 10
#define ENUM 11
#define EXTERN 12
#define FLOAT 13
#define FOR 14
#define GOTO 15
#define IF 16
#define INT 17
#define LONG 18
#define REGISTER 19
#define RETURN 20
#define SHORT 21
#define SIGNED 22
#define SIZEOF 23
#define STATIC 24
#define STRUCT 25
#define SWITCH 26
#define TYPEDEF 27
#define UNION 28
#define UNSIGNED 29
#define VOID 30
#define VOLATILE 31
#define WHILE 32
#define KEY_DESC "keyword"

//标志符
#define IDENTIFER 40
#define IDENTIFER_DESC "标志符"

//常量
#define INT_VAL 51 //整形常量
#define CHAR_VAL 52 //字符常量
#define FLOAT_VAL 53 //浮点数常量
#define STRING_VAL 54 //双精度浮点数常量
#define MACRO_VAL 55 //宏常量
#define CONSTANT_DESC "常量"

//运算符
#define NOT 61   // !
#define BYTE_AND 62 //&
#define COMPLEMENT 63 // ~
#define BYTE_XOR  64 // ^
#define MUL 65 // *
#define DIV 66// /
#define MOD 67 // %
#define ADD 68 // +
#define SUB 69 // -
#define LES_THAN 70 // <
#define GRT_THAN 71 // >
#define ASG 72 // =
#define ARROW 73 // ->
#define SELF_ADD 74 // ++
#define SELF_SUB 75 // --
#define LEFT_MOVE 76 // <<
#define RIGHT_MOVE 77 // >>
#define LES_EQUAL 78 // <=
#define GRT_EQUAL 79 // >=
#define EQUAL 80 // ==
#define NOT_EQUAL 81 // !=
#define AND 82 // &&
#define OR 83 // ||
#define COMPLETE_ADD 84 // +=
#define COMPLETE_SUB 85 // -=
#define COMPLETE_MUL 86 // *=
#define COMPLETE_DIV 87 // /=
#define COMPLETE_BYTE_XOR 88 // ^=
#define COMPLETE_BYTE_AND 89 // &=
#define COMPLETE_COMPLEMENT 90 // ~=
#define COMPLETE_MOD 91 //%=
#define BYTE_OR 92 // |

#define OPE_DESC "运算符"

//限界符
#define LEFT_BRA 100 // (
#define RIGHT_BRA 101 // )
#define LEFT_INDEX 102 // [
#define RIGHT_INDEX 103 // ]
#define L_BOUNDER 104 //  {
#define R_BOUNDER 105 // }
#define POINTER 106 // .
#define JING 107 // #
#define UNDER_LINE 108 // _
#define COMMA 109 // ,
#define SEMI 110 // ;
#define SIN_QUE 111 // '
#define DOU_QUE 112 // "

#define CLE_OPE_DESC "限界符"

#define NOTE1 120 // "/**/"凝视
#define NOTE2 121 // "//"凝视
#define NOTE_DESC "凝视"

#define HEADER 130 //头文件
#define HEADER_DESC "头文件"

//错误类型
#define FLOAT_ERROR "float表示错误"
#define FLOAT_ERROR_NUM 1
#define DOUBLE_ERROR "double表示错误"
#define DOUBLE_ERROR_NUM 2
#define NOTE_ERROR "凝视没有结束符"
#define NOTE_ERROR_NUM 3
#define STRING_ERROR "字符串常量没有结束符"
#define STRING_ERROR_NUM 4
#define CHARCONST_ERROR "字符常量没有结束符"
#define CHARCONST_ERROR_NUM 5
#define CHAR_ERROR "非法字符"
#define CHAR_ERROR_NUM 6
#define LEFT_BRA_ERROR "'('没有相应项"
#define LEFT_BRA_ERROR_NUM 7
#define RIGHT_BRA_ERROR "')'没有相应项"
#define RIGHT_BRA_ERROR_NUM 8
#define LEFT_INDEX_ERROR "'['没有相应项"
#define LEFT_INDEX_ERROR_NUM 9
#define RIGHT_INDEX_ERROR "']'没有相应项"
#define RIGHT_INDEX_ERROR_NUM 10
#define L_BOUNDER_ERROR "'{'没有相应项"
#define L_BOUNDER_ERROR_NUM 11
#define R_BOUNDER_ERROR "'}'没有相应项"
#define R_BOUNDER_ERROR_NUM 12
#define PRE_PROCESS_ERROR "预处理错误" //头文件或者宏定义错误
#define PRE_PROCESS_ERROR_NUM  13

#define _NULL "无"

#define DESCRIBE 4000
#define TYPE 4001
#define STRING 4002
#define DIGIT 4003

struct NormalNode
{
char content[30];//内容
char describe[30];//描写叙述
int type;//种别码
int addr;//入口地址
int line;//所在行数
NormalNode * next;//下一个节点
};

void initKeyMapping();
void initOperMapping();
void initLimitMapping();

void initNode();
void createNewNode(char * content,char *descirbe,int type,int addr,int line);
void createNewError(char * content,char *descirbe,int type,int line);
int createNewIden(char * content,char *descirbe,int type,int addr,int line);
void printNodeLink();
void printErrorLink();
void printIdentLink();
int mystrlen(char * word);
void preProcess(char * word,int line);
void close();
int seekKey(char * word);
void scanner();
void BraMappingError();

#endif


语法分析头文件:

SynAnalysis.h

//SynAnalysis.h
#ifndef _SYNANALYSIS_H
#define _SYNANALYSIS_H

#define GRAMMAR_ARROW 2000 //->
#define GRAMMAR_OR 2001 // |
#define GRAMMAR_NULL 2002 //空值
#define GRAMMAR_SPECIAL 2003 //特殊符号#
#define GRAMMAR_BASE 2010 //动态生成的基值

#define Stack_Size 5000

typedef struct
{
int elem[Stack_Size];
int top;
} SeqStack;

void initGrammer();
int seekCodeNum(char * word);
void ceshi();
void First();
void Follow();
void Select();
void MTable();
void Analysis();
#endif


词法分析Cpp文件:(与先前写过的一片博客相类似,改了部分)

LexAnalysis.cpp

//LexAnalysis.cpp
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <iomanip>
#include "LexAnalysis.h"

using namespace std;

int leftSmall = 0;//左小括号
int rightSmall = 0;//右小括号
int leftMiddle = 0;//左中括号
int rightMiddle = 0;//右中括号
int leftBig = 0;//左大括号
int rightBig = 0;//右大括号
int lineBra[6][1000] = {0};//括号和行数的相应关系,第一维代表左右6种括号
int static_iden_number = 0;//模拟标志符的地址,自增
//Token节点

NormalNode * normalHead;//首结点

//错误节点
struct ErrorNode
{
char content[30];//错误内容
char describe[30];//错误描写叙述
int type;
int line;//所在行数
ErrorNode * next;//下一个节点
};

ErrorNode * errorHead;//首节点

//标志符节点
struct IdentiferNode
{
char content[30];//内容
char describe[30];//描写叙述
int type;//种别码
int addr;//入口地址
int line;//所在行数
IdentiferNode * next;//下一个节点
};
IdentiferNode * idenHead;//首节点

vector<pair<const char *,int> > keyMap;
vector<pair<const char *,int> > operMap;
vector<pair<const char *,int> > limitMap;

//初始化C语言的keyword的集合
void initKeyMapping()
{
keyMap.clear();
keyMap.push_back(make_pair("auto",AUTO));
keyMap.push_back(make_pair("break",BREAK));
keyMap.push_back(make_pair("case",CASE));
keyMap.push_back(make_pair("char",CHAR));
keyMap.push_back(make_pair("const",CONST));
keyMap.push_back(make_pair("continue",CONTINUE));
keyMap.push_back(make_pair("default",DEFAULT));
keyMap.push_back(make_pair("do",DO));
keyMap.push_back(make_pair("double",DOUBLE));
keyMap.push_back(make_pair("else",ELSE));
keyMap.push_back(make_pair("enum",ENUM));
keyMap.push_back(make_pair("extern",EXTERN));
keyMap.push_back(make_pair("float",FLOAT));
keyMap.push_back(make_pair("for",FOR));
keyMap.push_back(make_pair("goto",GOTO));
keyMap.push_back(make_pair("if",IF));
keyMap.push_back(make_pair("int",INT));
keyMap.push_back(make_pair("long",LONG));
keyMap.push_back(make_pair("register",REGISTER));
keyMap.push_back(make_pair("return",RETURN));
keyMap.push_back(make_pair("short",SHORT));
keyMap.push_back(make_pair("signed",SIGNED));
keyMap.push_back(make_pair("sizeof",SIZEOF));
keyMap.push_back(make_pair("static",STATIC));
keyMap.push_back(make_pair("struct",STRUCT));
keyMap.push_back(make_pair("switch",SWITCH));
keyMap.push_back(make_pair("typedef",TYPEDEF));
keyMap.push_back(make_pair("union",UNION));
keyMap.push_back(make_pair("unsigned",UNSIGNED));
keyMap.push_back(make_pair("void",VOID));
keyMap.push_back(make_pair("volatile",VOLATILE));
keyMap.push_back(make_pair("while",WHILE));

keyMap.push_back(make_pair("describe",DESCRIBE));
keyMap.push_back(make_pair("type",TYPE));
keyMap.push_back(make_pair("string",STRING));
keyMap.push_back(make_pair("digit",DIGIT));
}
void initOperMapping()
{
operMap.clear();
operMap.push_back(make_pair("!",NOT));
operMap.push_back(make_pair("&",BYTE_AND));
operMap.push_back(make_pair("~",COMPLEMENT));
operMap.push_back(make_pair("^",BYTE_XOR));
operMap.push_back(make_pair("*",MUL));
operMap.push_back(make_pair("/",DIV));
operMap.push_back(make_pair("%",MOD));
operMap.push_back(make_pair("+",ADD));
operMap.push_back(make_pair("-",SUB));
operMap.push_back(make_pair("<",LES_THAN));
operMap.push_back(make_pair(">",GRT_THAN));
operMap.push_back(make_pair("=",ASG));
operMap.push_back(make_pair("->",ARROW));
operMap.push_back(make_pair("++",SELF_ADD));
operMap.push_back(make_pair("--",SELF_SUB));
operMap.push_back(make_pair("<<",LEFT_MOVE));
operMap.push_back(make_pair(">>",RIGHT_MOVE));
operMap.push_back(make_pair("<=",LES_EQUAL));
operMap.push_back(make_pair(">=",GRT_EQUAL));
operMap.push_back(make_pair("==",EQUAL));
operMap.push_back(make_pair("!=",NOT_EQUAL));
operMap.push_back(make_pair("&&",AND));
operMap.push_back(make_pair("||",OR));
operMap.push_back(make_pair("+=",COMPLETE_ADD));
operMap.push_back(make_pair("-=",COMPLETE_SUB));
operMap.push_back(make_pair("*=",COMPLETE_MUL));
operMap.push_back(make_pair("/=",COMPLETE_DIV));
operMap.push_back(make_pair("^=",COMPLETE_BYTE_XOR));
operMap.push_back(make_pair("&=",COMPLETE_BYTE_AND));
operMap.push_back(make_pair("~=",COMPLETE_COMPLEMENT));
operMap.push_back(make_pair("%=",COMPLETE_MOD));
operMap.push_back(make_pair("|",BYTE_OR));
}
void initLimitMapping()
{
limitMap.clear();
limitMap.push_back(make_pair("(",LEFT_BRA));
limitMap.push_back(make_pair(")",RIGHT_BRA));
limitMap.push_back(make_pair("[",LEFT_INDEX));
limitMap.push_back(make_pair("]",RIGHT_INDEX));
limitMap.push_back(make_pair("{",L_BOUNDER));
limitMap.push_back(make_pair("}",R_BOUNDER));
limitMap.push_back(make_pair(".",POINTER));
limitMap.push_back(make_pair("#",JING));
limitMap.push_back(make_pair("_",UNDER_LINE));
limitMap.push_back(make_pair(",",COMMA));
limitMap.push_back(make_pair(";",SEMI));
limitMap.push_back(make_pair("'",SIN_QUE));
limitMap.push_back(make_pair("\"",DOU_QUE));
}
void initNode()
{
normalHead = new NormalNode();
strcpy(normalHead->content,"");
strcpy(normalHead->describe,"");
normalHead->type = -1;
normalHead->addr = -1;
normalHead->line = -1;
normalHead->next = NULL;

errorHead = new ErrorNode();
strcpy(errorHead->content,"");
strcpy(errorHead->describe,"");
errorHead->line = -1;
errorHead->next = NULL;

idenHead = new IdentiferNode();
strcpy(idenHead->content,"");
strcpy(idenHead->describe,"");
idenHead->type = -1;
idenHead->addr = -1;
idenHead->line = -1;
idenHead->next = NULL;
}

void createNewNode(char * content,char *descirbe,int type,int addr,int line)
{
NormalNode * p = normalHead;
NormalNode * temp = new NormalNode();

while(p->next!=NULL)
{
p = p->next;
}

strcpy(temp->content,content);
strcpy(temp->describe,descirbe);
temp->type = type;
temp->addr = addr;
temp->line = line;
temp->next = NULL;

p->next = temp;
}
void createNewError(char * content,char *descirbe,int type,int line)
{
ErrorNode * p = errorHead;
ErrorNode * temp = new ErrorNode();

strcpy(temp->content,content);
strcpy(temp->describe,descirbe);
temp->type = type;
temp->line = line;
temp->next = NULL;
while(p->next!=NULL)
{
p = p->next;
}
p->next = temp;
}
//返回值是新的标志符的入口地址
int createNewIden(char * content,char *descirbe,int type,int addr,int line)
{
IdentiferNode * p = idenHead;
IdentiferNode * temp = new IdentiferNode();
int flag = 0;
int addr_temp = -2;
while(p->next!=NULL)
{
if(strcmp(content,p->next->content) == 0)
{
flag = 1;
addr_temp = p->next->addr;
}
p = p->next;
}
if(flag == 0)
{
addr_temp = ++static_iden_number;//用自增来模拟入口地址
}
strcpy(temp->content,content);
strcpy(temp->describe,descirbe);
temp->type = type;
temp->addr = addr_temp;
temp->line = line;
temp->next = NULL;
p->next = temp;
return addr_temp;
}

void printNodeLink()
{
NormalNode * p = normalHead;
p = p->next;
cout<<"************************************分析表******************************"<<endl<<endl;
cout<<setw(30)<<"内容"<<setw(10)<<"描写叙述"<<"\t"<<"种别码"<<"\t"<<"地址"<<"\t"<<"行号"<<endl;
while(p!=NULL)
{
if(p->type == IDENTIFER)
{
cout<<setw(30)<<p->content<<setw(10)<<p->describe<<"\t"<<p->type<<"\t"<<p->addr<<"\t"<<p->line<<endl;
}
else
{
cout<<setw(30)<<p->content<<setw(10)<<p->describe<<"\t"<<p->type<<"\t"<<"\t"<<p->line<<endl;
}
p = p->next;
}
cout<<endl<<endl;
}
/*
错误种类:
1.float表示错误
2.double表示错误
3.凝视没有结束符
4.字符串常量没有结束符
5.字符常量没有结束符
6.非法字符
7.'('没有相应项
8.预处理错误
*/
void printErrorLink()
{
ErrorNode * p = errorHead;
p = p->next;
cout<<"************************************错误表******************************"<<endl<<endl;
cout<<setw(10)<<"内容"<<setw(30)<<"描写叙述"<<"\t"<<"类型"<<"\t"<<"行号"<<endl;
while(p!=NULL)
{
cout<<setw(10)<<p->content<<setw(30)<<p->describe<<"\t"<<p->type<<"\t"<<p->line<<endl;
p = p->next;
}
cout<<endl<<endl;
}
//标志符表,有反复部分。暂不考虑
void printIdentLink()
{
IdentiferNode * p = idenHead;
p = p->next;
cout<<"************************************标志符表******************************"<<endl<<endl;
cout<<setw(30)<<"内容"<<setw(10)<<"描写叙述"<<"\t"<<"种别码"<<"\t"<<"地址"<<"\t"<<"行号"<<endl;
while(p!=NULL)
{
cout<<setw(30)<<p->content<<setw(10)<<p->describe<<"\t"<<p->type<<"\t"<<p->addr<<"\t"<<p->line<<endl;
p = p->next;
}
cout<<endl<<endl;
}
int mystrlen(char * word)
{
if(*word == '\0')
{
return 0;
}
else
{
return 1+mystrlen(word+1);
}
}
//预处理,处理头文件和宏定义
void preProcess(char * word,int line)
{
const char * include_temp = "include";
const char * define_temp = "define";
char * p_include,*p_define;
int flag = 0;
p_include = strstr(word,include_temp);
if(p_include!=NULL)
{
flag = 1;
int i;
for(i=7;;)
{
if(*(p_include+i) == ' ' || *(p_include+i) == '\t')
{
i++;
}
else
{
break;
}
}
createNewNode(p_include+i,HEADER_DESC,HEADER,-1,line);
}
else
{
p_define = strstr(word,define_temp);
if(p_define!=NULL)
{
flag = 1;
int i;
for(i=7;;)
{
if(*(p_define+i) == ' ' || *(p_define+i) == '\t')
{
i++;
}
else
{
break;
}
}
createNewNode(p_define+i,CONSTANT_DESC,MACRO_VAL,-1,line);
}
}
if(flag == 0)
{
createNewError(word,PRE_PROCESS_ERROR,PRE_PROCESS_ERROR_NUM,line);
}
}

void close()
{
//delete idenHead;
//delete errorHead;
//delete normalHead;
}

int seekKey(char * word)
{
for(int i=0; i<keyMap.size(); i++)
{
if(strcmp(word,keyMap[i].first) == 0)
{
return i+1;
}
}
return IDENTIFER;
}

void scanner()
{
char filename[30];
char ch;
char array[30];//单词长度上限是30
char * word;
int i;
int line = 1;//行数

FILE * infile;
printf("请输入要进行语法分析的C语言程序:\n");
scanf("%s",filename);
infile = fopen(filename,"r");
while(!infile)
{
printf("打开文件失败!\n");
return;
}
ch = fgetc(infile);
while(ch!=EOF)
{

i = 0;
//以字母或者下划线开头,处理keyword或者标识符
if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z') || ch == '_')
{
while((ch>='A' && ch<='Z')||(ch>='a' && ch<='z')||(ch>='0' && ch<='9') || ch == '_')
{
array[i++] = ch;
ch = fgetc(infile);
}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
int seekTemp = seekKey(word);
if(seekTemp!=IDENTIFER)
{
createNewNode(word,KEY_DESC,seekTemp,-1,line);
}
else
{
int addr_tmp = createNewIden(word,IDENTIFER_DESC,seekTemp,-1,line);
createNewNode(word,IDENTIFER_DESC,seekTemp,addr_tmp,line);
}
fseek(infile,-1L,SEEK_CUR);//向后回退一位
}
//以数字开头。处理数字
else if(ch >='0' && ch<='9')
{
int flag = 0;
int flag2 = 0;
//处理整数
while(ch >='0' && ch<='9')
{
array[i++] = ch;
ch = fgetc(infile);
}
//处理float
if(ch == '.')
{
flag2 = 1;
array[i++] = ch;
ch = fgetc(infile);
if(ch>='0' && ch<='9')
{
while(ch>='0' && ch<='9')
{
array[i++] = ch;
ch = fgetc(infile);
}
}
else
{
flag = 1;
}

//处理Double
if(ch == 'E' || ch == 'e')
{
array[i++] = ch;
ch = fgetc(infile);
if(ch == '+' || ch == '-')
{
array[i++] = ch;
ch = fgetc(infile);
}
if(ch >='0' && ch<='9')
{
array[i++] = ch;
ch = fgetc(infile);
}
else
{
flag = 2;
}
}

}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
if(flag == 1)
{
createNewError(word,FLOAT_ERROR,FLOAT_ERROR_NUM,line);
}
else if(flag == 2)
{
createNewError(word,DOUBLE_ERROR,DOUBLE_ERROR_NUM,line);
}
else
{
if(flag2 == 0)
{
createNewNode(word,CONSTANT_DESC,INT_VAL,-1,line);
}
else
{
createNewNode(word,CONSTANT_DESC,FLOAT_VAL,-1,line);
}
}
fseek(infile,-1L,SEEK_CUR);//向后回退一位
}
//以"/"开头
else if(ch == '/')
{
ch = fgetc(infile);
//处理运算符"/="
if(ch == '=')
{
createNewNode("/=",OPE_DESC,COMPLETE_DIV,-1,line);
}
//处理"/**/"型凝视
else if(ch == '*')
{
ch =  fgetc(infile);
while(1)
{
while(ch != '*')
{
if(ch == '\n')
{
line++;
}
ch = fgetc(infile);
if(ch == EOF)
{
createNewError(_NULL,NOTE_ERROR,NOTE_ERROR_NUM,line);
return;
}
}
ch = fgetc(infile);
if(ch == '/')
{
break;
}
if(ch == EOF)
{
createNewError(_NULL,NOTE_ERROR,NOTE_ERROR_NUM,line);
return;
}
}
createNewNode(_NULL,NOTE_DESC,NOTE1,-1,line);
}
//处理"//"型凝视
else if(ch == '/')
{
while(ch!='\n')
{
ch = fgetc(infile);
if(ch == EOF)
{
createNewNode(_NULL,NOTE_DESC,NOTE2,-1,line);
return;
}
}
line++;
createNewNode(_NULL,NOTE_DESC,NOTE2,-1,line);
if(ch == EOF)
{
return;
}
}
//处理除号
else
{
createNewNode("/",OPE_DESC,DIV,-1,line);
}
}
//处理常量字符串
else if(ch == '"')
{
createNewNode("\"",CLE_OPE_DESC,DOU_QUE,-1,line);
ch = fgetc(infile);
i = 0;
while(ch!='"')
{
array[i++] = ch;
if(ch == '\n')
{
line++;
}
ch = fgetc(infile);
if(ch == EOF)
{
createNewError(_NULL,STRING_ERROR,STRING_ERROR_NUM,line);
return;
}
}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
createNewNode(word,CONSTANT_DESC,STRING_VAL,-1,line);
createNewNode("\"",CLE_OPE_DESC,DOU_QUE,-1,line);
}
//处理常量字符
else if(ch == '\'')
{
createNewNode("\'",CLE_OPE_DESC,SIN_QUE,-1,line);
ch = fgetc(infile);
i = 0;
while(ch!='\'')
{
array[i++] = ch;
if(ch == '\n')
{
line++;
}
ch = fgetc(infile);
if(ch == EOF)
{
createNewError(_NULL,CHARCONST_ERROR,CHARCONST_ERROR_NUM,line);
return;
}
}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
createNewNode(word,CONSTANT_DESC,CHAR_VAL,-1,line);
createNewNode("\'",CLE_OPE_DESC,SIN_QUE,-1,line);
}
else if(ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
{
if(ch == '\n')
{
line++;
}
}
else
{
if(ch == EOF)
{
return;
}
//处理头文件和宏常量(预处理)
else if(ch == '#')
{
while(ch!='\n' && ch!=EOF)
{
array[i++] = ch;
ch = fgetc(infile);
}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
preProcess(word,line);

fseek(infile,-1L,SEEK_CUR);//向后回退一位
}
//处理-开头的运算符
else if(ch == '-')
{
array[i++] = ch;
ch = fgetc(infile);
if(ch >='0' && ch<='9')
{
int flag = 0;
int flag2 = 0;
//处理整数
while(ch>='0' && ch<='9')
{
array[i++] = ch;
ch = fgetc(infile);
}
//处理float
if(ch == '.')
{
flag2 = 1;
array[i++] = ch;
ch = fgetc(infile);
if(ch>='0' && ch<='9')
{
while(ch>='0' && ch<='9')
{
array[i++] = ch;
ch = fgetc(infile);
}
}
else
{
flag = 1;
}
//处理Double
if(ch == 'E' || ch == 'e')
{
array[i++] = ch;
ch = fgetc(infile);
if(ch == '+' || ch == '-')
{
array[i++] = ch;
ch = fgetc(infile);
}
if(ch >='0' && ch<='9')
{
array[i++] = ch;
ch = fgetc(infile);
}
else
{
flag = 2;
}
}
}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
if(flag == 1)
{
createNewError(word,FLOAT_ERROR,FLOAT_ERROR_NUM,line);
}
else if(flag == 2)
{
createNewError(word,DOUBLE_ERROR,DOUBLE_ERROR_NUM,line);
}
else
{
if(flag2 == 0)
{
createNewNode(word,CONSTANT_DESC,INT_VAL,-1,line);
}
else
{
createNewNode(word,CONSTANT_DESC,FLOAT_VAL,-1,line);
}
}
fseek(infile,-1L,SEEK_CUR);//向后回退一位
}
else if(ch == '>')
{
createNewNode("->",OPE_DESC,ARROW,-1,line);
}
else if(ch == '-')
{
createNewNode("--",OPE_DESC,SELF_SUB,-1,line);
}
else if(ch == '=')
{
createNewNode("--",OPE_DESC,SELF_SUB,-1,line);
}
else
{
createNewNode("-",OPE_DESC,SUB,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理+开头的运算符
else if(ch == '+')
{
ch = fgetc(infile);
if(ch == '+')
{
createNewNode("++",OPE_DESC,SELF_ADD,-1,line);
}
else if(ch == '=')
{
createNewNode("+=",OPE_DESC,COMPLETE_ADD,-1,line);
}
else
{
createNewNode("+",OPE_DESC,ADD,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理*开头的运算符
else if(ch == '*')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("*=",OPE_DESC,COMPLETE_MUL,-1,line);
}
else
{
createNewNode("*",OPE_DESC,MUL,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理按^开头的运算符
else if(ch == '^')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("^=",OPE_DESC,COMPLETE_BYTE_XOR,-1,line);
}
else
{
createNewNode("^",OPE_DESC,BYTE_XOR,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理%开头的运算符
else if(ch == '%')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("%=",OPE_DESC,COMPLETE_MOD,-1,line);
}
else
{
createNewNode("%",OPE_DESC,MOD,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理&开头的运算符
else if(ch == '&')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("&=",OPE_DESC,COMPLETE_BYTE_AND,-1,line);
}
else if(ch == '&')
{
createNewNode("&&",OPE_DESC,AND,-1,line);
}
else
{
createNewNode("&",OPE_DESC,BYTE_AND,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理~开头的运算符
else if(ch == '~')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("~=",OPE_DESC,COMPLETE_COMPLEMENT,-1,line);
}
else
{
createNewNode("~",OPE_DESC,COMPLEMENT,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理!开头的运算符
else if(ch == '!')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("!=",OPE_DESC,NOT_EQUAL,-1,line);
}
else
{
createNewNode("!",OPE_DESC,NOT,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理<开头的运算符
else if(ch == '<')
{
ch = fgetc(infile);
if(ch == '<')
{
createNewNode("<<",OPE_DESC,LEFT_MOVE,-1,line);
}
else if(ch == '=')
{
createNewNode("<=",OPE_DESC,LES_EQUAL,-1,line);
}
else
{
createNewNode("<",OPE_DESC,LES_THAN,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理>开头的运算符
else if(ch == '>')
{
ch = fgetc(infile);
if(ch == '>')
{
createNewNode(">>",OPE_DESC,RIGHT_MOVE,-1,line);
}
else if(ch == '=')
{
createNewNode(">=",OPE_DESC,GRT_EQUAL,-1,line);
}
else
{
createNewNode(">",OPE_DESC,GRT_THAN,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
//处理|开头的运算符
else if(ch == '|')
{
ch = fgetc(infile);
if(ch == '|')
{
createNewNode("||",OPE_DESC,OR,-1,line);
}
else
{
createNewNode("|",OPE_DESC,BYTE_OR,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
else if(ch == '=')
{
ch = fgetc(infile);
if(ch == '=')
{
createNewNode("==",OPE_DESC,EQUAL,-1,line);
}
else
{
createNewNode("=",OPE_DESC,ASG,-1,line);
fseek(infile,-1L,SEEK_CUR);
}
}
else if(ch == '(')
{
leftSmall++;
lineBra[0][leftSmall] = line;
createNewNode("(",CLE_OPE_DESC,LEFT_BRA,-1,line);
}
else if(ch == ')')
{
rightSmall++;
lineBra[1][rightSmall] = line;
createNewNode(")",CLE_OPE_DESC,RIGHT_BRA,-1,line);
}
else if(ch == '[')
{
leftMiddle++;
lineBra[2][leftMiddle] = line;
createNewNode("[",CLE_OPE_DESC,LEFT_INDEX,-1,line);
}
else if(ch == ']')
{
rightMiddle++;
lineBra[3][rightMiddle] = line;
createNewNode("]",CLE_OPE_DESC,RIGHT_INDEX,-1,line);
}
else if(ch == '{')
{
leftBig++;
lineBra[4][leftBig] = line;
createNewNode("{",CLE_OPE_DESC,L_BOUNDER,-1,line);
}
else if(ch == '}')
{
rightBig++;
lineBra[5][rightBig] = line;
createNewNode("}",CLE_OPE_DESC,R_BOUNDER,-1,line);
}
else if(ch == '.')
{
createNewNode(".",CLE_OPE_DESC,POINTER,-1,line);
}
else if(ch == ',')
{
createNewNode(",",CLE_OPE_DESC,COMMA,-1,line);
}
else if(ch == ';')
{
createNewNode(";",CLE_OPE_DESC,SEMI,-1,line);
}
else
{
char temp[2];
temp[0] = ch;
temp[1] = '\0';
createNewError(temp,CHAR_ERROR,CHAR_ERROR_NUM,line);
}
}
ch = fgetc(infile);
}
}
void BraMappingError()
{
if(leftSmall != rightSmall)
{
int i = (leftSmall>rightSmall) ? (leftSmall-rightSmall) : (rightSmall - leftSmall);
bool  flag = (leftSmall>rightSmall) ?

true : false;
if(flag)
{
while(i--)
{
createNewError(_NULL,LEFT_BRA_ERROR,LEFT_BRA_ERROR_NUM,lineBra[0][i+1]);
}
}
else
{
while(i--)
{
createNewError(_NULL,RIGHT_BRA_ERROR,RIGHT_BRA_ERROR_NUM,lineBra[1][i+1]);
}
}
}
if(leftMiddle != rightMiddle)
{
int i = (leftMiddle>rightMiddle) ?

(leftMiddle-rightMiddle) : (rightMiddle - leftMiddle);
bool flag = (leftMiddle>rightMiddle) ? true : false;
if(flag)
{
while(i--)
{
createNewError(_NULL,LEFT_INDEX_ERROR,LEFT_INDEX_ERROR_NUM,lineBra[2][i+1]);
}
}
else
{
while(i--)
{
createNewError(_NULL,RIGHT_INDEX_ERROR,RIGHT_INDEX_ERROR_NUM,lineBra[3][i+1]);
}
}
}
if(leftBig != rightBig)
{
int i = (leftBig>rightBig) ?

(leftBig-rightBig) : (rightBig - leftSmall);
bool flag = (leftBig>rightBig) ?

true : false;
if(flag)
{
while(i--)
{
createNewError(_NULL,L_BOUNDER_ERROR,L_BOUNDER_ERROR_NUM,lineBra[4][i+1]);
}
}
else
{
while(i--)
{
createNewError(_NULL,R_BOUNDER_ERROR,R_BOUNDER_ERROR_NUM,lineBra[5][i+1]);
}
}
}
}


语法分析Cpp代码:

//SynAnalysis.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <fstream>
#include <vector>
#include <conio.h>
#include "LexAnalysis.h"
#include "SynAnalysis.h"

using namespace std;

#define Max_Proc 500
#define Max_Length 500

#define Max_NonTer 60
#define Max_Ter 60
#define Max_Length2 100

int procNum = 0;
//proc的维数都是从1開始的
int proc[Max_Proc][Max_Length];//产生式的数组,里边存储了终结符或者非终结符相应的编号
int first[Max_Proc][Max_Length];
int follow[Max_Proc][Max_Length];
int select[Max_Proc][Max_Length];
int M[Max_NonTer][Max_Ter][Max_Length2];

int connectFirst[Max_Length];//将某些First集结合起来的集合

int firstVisit[Max_Proc];//记录某非终结符的First集是否已经求过
int followVisit[Max_Proc];//记录某非终结符的Follow集是否已经求过

int empty[Max_Proc];//可推出空的非终结符的编号
int emptyRecu[Max_Proc];//在求可推出空的非终结符的编号集时使用的防治递归的集合
int followRecu[Max_Proc];//在求Follow集时使用的防治递归的集合

//extern的部分代表可能出现的终结符和其编号
extern vector<pair<const char *,int> > keyMap;
extern vector<pair<const char *,int> > operMap;
extern vector<pair<const char *,int> > limitMap;

extern NormalNode * normalHead;//首结点

fstream resultfile;

vector<pair<const char *,int> > nonTerMap;//非终结符映射表,不可反复的
vector<pair<const char *,int> > terMap;//终结符映射表,不可反复的
vector<pair<const char *,int> > specialMap;//文法中的特殊符号映射表,包含-> | $(空)

void initSpecialMapping()
{
specialMap.clear();
specialMap.push_back(make_pair("->",GRAMMAR_ARROW));
specialMap.push_back(make_pair("|",GRAMMAR_OR));
specialMap.push_back(make_pair("$",GRAMMAR_NULL));
specialMap.push_back(make_pair("#",GRAMMAR_SPECIAL));

}
const char * searchMapping(int num)
{
//标志符
if(num == IDENTIFER)
{
return "id";
}
//处理文法中的特殊符号
for(int i = 0; i<specialMap.size(); i++)
{
if(specialMap[i].second == num)
{
return specialMap[i].first;
}
}
//处理非终结符
for(int i=0; i<nonTerMap.size(); i++)
{
if(nonTerMap[i].second == num)
{
return nonTerMap[i].first;
}
}
//处理终结符
for(int i=0; i<terMap.size(); i++)
{
if(terMap[i].second == num)
{
return terMap[i].first;
}
}

}

//动态生成非终结符,在基点的基础上,确保不和终结符冲突
int dynamicNonTer(char *word)
{
int i = 0;
int dynamicNum;
for(i=0; i<nonTerMap.size(); i++)
{
if(strcmp(word,nonTerMap[i].first) == 0)
{
return nonTerMap[i].second;
}
}
if(i == nonTerMap.size())
{
if(i == 0)
{
dynamicNum = GRAMMAR_BASE;
nonTerMap.push_back(make_pair(word,dynamicNum));
}
else
{
dynamicNum = nonTerMap[nonTerMap.size()-1].second + 1;
nonTerMap.push_back(make_pair(word,dynamicNum));
}
}
return dynamicNum;
}
//推断某个标号是不是非终结符的标号,1代表是。0代表否
int inNonTer(int n)
{
for(int i=0; i<nonTerMap.size(); i++)
{
if(nonTerMap[i].second == n)
{
return 1;
}
}
return 0;
}
//推断某个标号是不是终结符的标号,1代表是。0代表否
int inTer(int n)
{
for(int i=0; i<terMap.size(); i++)
{
if(terMap[i].second == n)
{
return 1;
}
}
return 0;
}
//推断某个标号在不在此时的empty集中。1代表是。0代表否
int inEmpty(int n)
{
//当前Empty集的长度
int emptyLength = 0;
for(emptyLength = 0;; emptyLength++)
{
if(empty[emptyLength] == -1)
{
break;
}
}
for(int i = 0; i<emptyLength; i++)
{
if(empty[i] == n)
{
return 1;
}
}
return 0;

}
//推断某个标号在不在此时的emptyRecu集中。1代表是。0代表否
int inEmptyRecu(int n)
{
//当前Empty集的长度
int emptyLength = 0;
for(emptyLength = 0;; emptyLength++)
{
if(emptyRecu[emptyLength] == -1)
{
break;
}
}
for(int i = 0; i<emptyLength; i++)
{
if(emptyRecu[i] == n)
{
return 1;
}
}
return 0;
}
//推断某个标号在不在此时的followRecu集中,1代表是。0代表否
int inFollowRecu(int n)
{
int followLength = 0;
for(followLength = 0;; followLength++)
{
if(followRecu[followLength] == -1)
{
break;
}
}
for(int i = 0; i<followLength; i++)
{
if(followRecu[i] == n)
{
return 1;
}
}
return 0;
}

//推断某个标号是不是在产生式的右边
int inProcRight(int n,int * p)
{
//注意这里默认是从3開始
for(int i=3;; i++)
{
if(p[i] == -1)
{
break;
}
if(p[i] == n)
{
return 1;
}
}
return 0;
}

int seekCodeNum(char * word)
{
//处理文法中的特殊符号
for(int i = 0; i<specialMap.size(); i++)
{
if(strcmp(word,specialMap[i].first) == 0)
{
return specialMap[i].second;
}
}
//先搜索终结符映射表中有没有此终结符
for(int i=0; i<terMap.size(); i++)
{
if(strcmp(word,terMap[i].first) == 0)
{
return terMap[i].second;
}
}
for(int i = 0; i<keyMap.size(); i++)
{
if(strcmp(word,keyMap[i].first) == 0)
{
terMap.push_back(make_pair(word,keyMap[i].second));
return keyMap[i].second;
}
}

for(int i = 0; i<operMap.size(); i++)
{
if(strcmp(word,operMap[i].first) == 0)
{
terMap.push_back(make_pair(word,operMap[i].second));
return operMap[i].second;
}
}

for(int i = 0; i<limitMap.size(); i++)
{
if(strcmp(word,limitMap[i].first) == 0)
{
terMap.push_back(make_pair(word,limitMap[i].second));
return limitMap[i].second;
}
}

if(strcmp(word,"id")==0)
{
//处理标志符
terMap.push_back(make_pair(word,IDENTIFER));
return IDENTIFER;
}
else
{
//处理keyword、运算符、限界符表,即非终结符
return dynamicNonTer(word);
}
}
//切割" | "文法
void splitProc(int p[][Max_Length],int &line,int orNum)
{
if(p[line][1] == -1 || orNum == 0)
{
return;
}
int head = p[line][1];
int push = p[line][2];
int length = 0;
int right,left;
int lineTrue = line + orNum;
for(length = 3;;length++)
{
if(p[line][length] == -1)
{
break;
}
}
length--;
for(left = length,right = length;left>=2;)
{
if(p[line][left] == GRAMMAR_OR || left == 2)
{
p[line + orNum][1] = head;
p[line + orNum][2] = push;
for(int i=left+1;i<=right;i++)
{
p[line+orNum][i-left+2] = p[line][i];
}
p[line+orNum][right-left+3] = -1;
right = left = left-1;
orNum--;
}
else
{
left--;
}
}
line = lineTrue;
}
void initGrammer()
{
FILE * infile;
char ch;
char array[30];
char * word;
int i;
int codeNum;
int line = 1;
int count = 0;
int orNum = 0;
infile = fopen("wenfa.txt","r");
if(!infile)
{
printf("文法打开失败!\n");
return;
}
initSpecialMapping();
nonTerMap.clear();
terMap.clear();

memset(proc,-1,sizeof(proc));
memset(first,-1,sizeof(first));
memset(follow,-1,sizeof(follow));
memset(select,-1,sizeof(select));

memset(connectFirst,-1,sizeof(connectFirst));

memset(firstVisit,0,sizeof(firstVisit));//非终结符的first集还未求过
memset(followVisit,0,sizeof(followVisit));//非终结符的follow集还未求过

memset(empty,-1,sizeof(empty));
memset(emptyRecu,-1,sizeof(emptyRecu));
memset(followRecu,-1,sizeof(followRecu));

memset(M,-1,sizeof(M));

ch = fgetc(infile);
i = 0;
while(ch!=EOF)
{
i = 0;
while(ch == ' ' || ch == '\t')
{
ch = fgetc(infile);
}
while(ch!=' ' && ch!= '\n' && ch!=EOF)
{
array[i++] = ch;
ch = fgetc(infile);
}
while(ch == ' ' || ch == '\t')
{
ch = fgetc(infile);
}
word = new char[i+1];
memcpy(word,array,i);
word[i] = '\0';
codeNum = 0;
codeNum = seekCodeNum(word);
if(codeNum!=0)
{
count++;
if(codeNum == GRAMMAR_OR)
{
orNum++;
}
proc[line][count] = codeNum;

}
//原本须要回退一个字符。因为是冗余字符,不回退
if(ch == '\n')
{
splitProc(proc,line,orNum);//将" | "文法进行拆分
count = 0;
orNum = 0;
line++;
ch = fgetc(infile);
}
}
procNum = line - 1;
printf("************************************C语言文法******************************\n\n");
for(int i=1; i<line; i++)
{
for(int j=1; j<Max_Length; j++)
{
if(proc[i][j]!=-1)
{
printf("%s ",searchMapping(proc[i][j]));
}
else
{
break;
}
}
printf("\n");
}
printf("\n************************************文法终结符******************************\n\n");
for(int i=0; i<terMap.size(); i++)
{
printf("%s ",terMap[i].first);
}
printf("\n");
printf("\n************************************文法非终结符******************************\n\n");
for(int i=0; i<nonTerMap.size(); i++)
{
printf("%s ",nonTerMap[i].first);
}
printf("\n");
}
//将s集合合并至d集合中,type = 1代表包含空($),type = 2代表不包含空
void merge(int *d,int *s,int type)
{
int flag = 0;
for(int i = 0;; i++)
{
flag = 0;
if(s[i] == -1)
{
break;
}
int j = 0;
for(j = 0;; j++)
{
if(d[j] == -1)
{
break;
}
if(d[j] == s[i])
{
flag = 1;
break;
}
}
if(flag == 1)
{
continue;
}
if(type == 1)
{
d[j] = s[i];
}
else
{
if(s[i] != GRAMMAR_NULL)
{
d[j] = s[i];
}
}
d[j + 1] = -1;
}
}

void nullSet(int currentNum)
{
int temp[2];
for(int j = 1; j<=procNum; j++)
{
//假设右边的第一个是该字符。而且长度仅仅有1
if(proc[j][3] == currentNum && proc[j][4] == -1)
{
temp[0] = proc[j][1];
temp[1] = -1;
merge(empty,temp,1);
nullSet(proc[j][1]);
}
}
}
//推断该非终结符能否推出空。但终结符也可能传入,但没关系
int reduNull(int currentNon)
{
int temp[2];
int result = 1;
int mark = 0;
temp[0] = currentNon;
temp[1] = -1;
merge(emptyRecu,temp,1);//先将此符号并入防递归集合中
if(inEmpty(currentNon) == 1)
{
return 1;
}

for(int j = 1; j<=procNum; j++)
{
if(proc[j][1] == currentNon)
{
int rightLength = 0;
//先求出右部的长度
for(rightLength = 3;; rightLength++)
{
if(proc[j][rightLength] == -1)
{
break;
}
}
rightLength--;
//假设长度为1,而且已经求过
if(rightLength - 2 == 1 && inEmpty(proc[j][rightLength]))
{
return 1;
}
//假设长度为1,而且是终结符
else if(rightLength -2 == 1 && inTer(proc[j][rightLength]))
{
return 0;
}
//假设长度超过了2
else
{
for(int k=3; k<=rightLength; k++)
{
if(inEmptyRecu(proc[j][k]))
{
mark = 1;
}
}
if(mark == 1)
{
continue;
}
else
{
for(int k=3; k<=rightLength; k++)
{
result*= reduNull(proc[j][k]);
temp[0] = proc[j][k];
temp[1] = -1;
merge(emptyRecu,temp,1);//先将此符号并入防递归集合中
}
}
}
if(result == 0)
{
continue;
}
else if(result == 1)
{
return 1;
}
}
}
return 0;
}

//求first集。传入的參数是在非终结符集合中的序号
void firstSet(int i)
{
int k = 0;
int currentNon = nonTerMap[i].second;//当前的非终结符标号
//依次遍历所有产生式
for(int j = 1; j<=procNum; j++) //j代表第几个产生式
{
//找到该非终结符的产生式
if(currentNon == proc[j][1])//注意从1開始
{
//当右边的第一个是终结符或者空的时候
if(inTer(proc[j][3]) == 1 || proc[j][3] == GRAMMAR_NULL)
{
//并入当前非终结符的first集中
int temp[2];
temp[0] = proc[j][3];
temp[1] = -1;//事实上是模拟字符串操作的手段
merge(first[i],temp,1);
}
//当右边的第一个是非终结符的时候
else if(inNonTer(proc[j][3]) == 1)
{
//假设遇到左递归形式的,直接放过?
if(proc[j][3] == currentNon)
{
continue;
}
//记录下右边第一个非终结符的位置
for(k=0;; k++)
{
if(nonTerMap[k].second == proc[j][3])
{
break;
}

}
//当右边第一个非终结符还未訪问过的时候
if(firstVisit[k] == 0)
{
firstSet(k);
firstVisit[k] = 1;
}
merge(first[i],first[k],2);//假设first[k]此时有空值的话。临时不把空值并入first[i]中
int rightLength = 0;
//先求出右部的长度

for(rightLength = 3;; rightLength++)
{
if(proc[j][rightLength] == -1)
{
break;
}
}
//到眼下为止。仅仅求出了右边的第一个(还不包含空的部分)。For循环处理之后的
for(k = 3; k<rightLength; k++)
{
emptyRecu[0] = -1;//相当于初始化这个防递归集合

//假设右部的当前字符能推出空而且还不是最后一个字符,就将之后的一个字符并入First集中
if(reduNull(proc[j][k]) == 1 && k<rightLength -1)
{
int u = 0;
for(u=0;; u++)
{
//注意是记录下一个符号的位置
if(nonTerMap[u].second == proc[j][k+1])
{
break;
}
}
if(firstVisit[u] == 0)
{
firstSet(u);
firstVisit[u] = 1;
}
merge(first[i],first[u],2);
}
//到达最后一个字符,而且产生式右部都能推出空,将$并入First集中
else if(reduNull(proc[j][k]) == 1 && k == rightLength -1)
{
int temp[2];
temp[0] = GRAMMAR_NULL;
temp[1] = -1;//事实上是模拟字符串操作的手段
merge(first[i],temp,1);
}
else
{
break;
}
}
}
}
}
firstVisit[i] = 1;
}
void First()
{
//先求出能直接推出空的非终结符集合
nullSet(GRAMMAR_NULL);
printf("\n");
for(int i=0; i<nonTerMap.size(); i++)
{
firstSet(i);
}
printf("\n************************************First集******************************\n\n");
for(int i=0; i<nonTerMap.size(); i++)
{
printf("First[%s] = ",nonTerMap[i].first);
for(int j=0;; j++)
{
if(first[i][j] == -1)
{
break;
}
printf("%s ",searchMapping(first[i][j]));
}
printf("\n");
}
}
//将First结合起来的函数
void connectFirstSet(int *p)
{
int i = 0;
int flag = 0;
int temp[2];
//假设P的长度为1
if(p[1] == -1)
{
if(p[0] == GRAMMAR_NULL)
{
connectFirst[0] = GRAMMAR_NULL;
connectFirst[1] = -1;
}
else
{
for(i=0; i<nonTerMap.size(); i++)
{
if(nonTerMap[i].second == p[0])
{
flag = 1;
merge(connectFirst,first[i],1);
break;
}
}
//也可能是终结符
if(flag == 0)
{
for(i=0; i<terMap.size(); i++)
{
if(terMap[i].second == p[0])
{
temp[0] = terMap[i].second;
temp[1] = -1;
merge(connectFirst,temp,2);//终结符的First集就是其本身
break;
}
}
}
}
}
//假设p的长度大于1
else
{
for(i=0; i<nonTerMap.size(); i++)
{
if(nonTerMap[i].second == p[0])
{
flag = 1;
merge(connectFirst,first[i],2);
break;
}
}
//也可能是终结符
if(flag == 0)
{
for(i=0; i<terMap.size(); i++)
{
if(terMap[i].second == p[0])
{
temp[0] = terMap[i].second;
temp[1] = -1;
merge(connectFirst,temp,2);//终结符的First集就是其本身
break;
}
}
}
flag = 0;
int length = 0;
for(length = 0;; length++)
{
if(p[length] == -1)
{
break;
}
}
for(int k=0; k<length; k++)
{
emptyRecu[0] = -1;//相当于初始化这个防递归集合

//假设右部的当前字符能推出空而且还不是最后一个字符,就将之后的一个字符并入First集中
if(reduNull(p[k]) == 1 && k<length -1)
{
int u = 0;
for(u=0; u<nonTerMap.size(); u++)
{
//注意是记录下一个符号的位置
if(nonTerMap[u].second == p[k+1])
{
flag = 1;
merge(connectFirst,first[u],2);
break;
}
}
//也可能是终结符
if(flag == 0)
{
for(u=0; u<terMap.size(); u++)
{
//注意是记录下一个符号的位置
if(terMap[u].second == p[k+1])
{
temp[0] = terMap[i].second;
temp[1] = -1;
merge(connectFirst,temp,2);
break;
}
}
}
flag = 0;
}
//到达最后一个字符,而且产生式右部都能推出空,将$并入First集中
else if(reduNull(p[k]) == 1 && k == length -1)
{
temp[0] = GRAMMAR_NULL;
temp[1] = -1;//事实上是模拟字符串操作的手段
merge(connectFirst,temp,1);
}
else
{
break;
}
}
}
}
void followSet(int i)
{
int currentNon = nonTerMap[i].second;//当前的非终结符标号
int temp[2];
int result = 1;
temp[0] = currentNon;
temp[1] = -1;
merge(followRecu,temp,1);//将当前标号增加防递归集合中

//假设当前符号就是開始符号,把特殊符号增加其Follow集中
if(proc[1][1] == currentNon)
{
temp[0] = GRAMMAR_SPECIAL;//这个也是要处理的
temp[1] = -1;
merge(follow[i],temp,1);
}
for(int j = 1; j<=procNum; j++) //j代表第几个产生式
{
//假设该非终结符在某个产生式的右部存在
if(inProcRight(currentNon,proc[j]) == 1)
{
int rightLength = 1;
int k = 0;//k为该非终结符在产生式右部的序号
int flag = 0;
int leftNum = proc[j][1];//产生式的左边
int h = 0;
int kArray[Max_Length2];
memset(kArray,-1,sizeof(kArray));
for(h = 0; h < nonTerMap.size(); h++)
{
if(nonTerMap[h].second == leftNum)
{
break;
}
}

for(rightLength = 1;; rightLength++)
{
if(currentNon == proc[j][rightLength+2])
{
kArray[k++] = rightLength;
}
if(proc[j][rightLength+2] == -1)
{
break;
}
}
rightLength--;
for(int y=0;; y++)
{
if(kArray[y] == -1)
{
break;
}
//假设该非终结符在右部产生式的最后
if(kArray[y] == rightLength)
{

if(inFollowRecu(leftNum) == 1)
{
merge(follow[i],follow[h],1);
continue;
}
if(followVisit[h] == 0)
{
followSet(h);
followVisit[h] = 1;
}
merge(follow[i],follow[h],1);
}
//假设不在最后
else
{
int n = 0;
result = 1;//这是关键的,曾在这里失误过
for(n=kArray[y]+1; n<=rightLength; n++)
{
emptyRecu[0] = -1;
result *= reduNull(proc[j][n+2]);
}
if(result == 1)
{
if(inFollowRecu(leftNum) == 1)
{
merge(follow[i],follow[h],1);
continue;
}
if(followVisit[h] == 0)
{
followSet(h);
followVisit[h] = 1;
}
merge(follow[i],follow[h],1);
}
int temp2[Max_Length];
memset(temp2,-1,sizeof(temp2));
for(n=kArray[y]+1; n<=rightLength; n++)
{
temp2[n-kArray[y]-1] = proc[j][n+2];
}
temp2[rightLength-kArray[y]] = -1;
connectFirst[0] = -1;//应该又一次初始化一下
connectFirstSet(temp2);
merge(follow[i],connectFirst,2);
}
}
}
}
followVisit[i] = 1;
}

//求所有非终结符的Follow集
void Follow()
{
for(int i=0; i<nonTerMap.size(); i++)
{
followRecu[0] = -1;
followSet(i);
}
printf("\n************************************Follow集******************************\n\n");
for(int i=0; i<nonTerMap.size(); i++)
{
printf("Follow[%s] = ",nonTerMap[i].first);
for(int j=0;; j++)
{
if(follow[i][j] == -1)
{
break;
}
printf("%s ",searchMapping(follow[i][j]));
}
printf("\n");
}
}
//求已经分解的产生式相应的Select集,注意Select集中不能含有空($),因而Type=2
void Select()
{
for(int i = 1; i<=procNum; i++) //j代表第几个产生式
{
int leftNum = proc[i][1];//产生式的左边
int h = 0;
int result = 1;
for(h = 0; h < nonTerMap.size(); h++)
{
if(nonTerMap[h].second == leftNum)
{
break;
}
}

int rightLength = 1;
for(rightLength = 1;; rightLength++)
{
if(proc[i][rightLength+2] == -1)
{
break;
}
}
rightLength--;
//假设右部推出式的长度为1而且是空,select[i-1] = follow[左边]
if(rightLength == 1 && proc[i][rightLength + 2] == GRAMMAR_NULL)
{
merge(select[i-1],follow[h],2);
}
//假设右部不是空的时候,select[i-1] = first[右部所有]
//假设右部可以推出空,select[i-1] = first[右部所有] ^ follow[左边]
else
{
int temp2[Max_Length];
int n = 0;
memset(temp2,-1,sizeof(temp2));
for(n=1; n<=rightLength; n++)
{
temp2[n-1] = proc[i][n+2];
}
temp2[rightLength] = -1;
connectFirst[0] = -1;//应该又一次初始化一下
connectFirstSet(temp2);
merge(select[i-1],connectFirst,2);
for(n=1; n<=rightLength; n++)
{
emptyRecu[0] = -1;
result *= reduNull(proc[i][n+2]);
}
//假设右部能推出空,将follow[左边]并入select[i-1]中
if(result == 1)
{
merge(select[i-1],follow[h],2);
}
}
}
printf("\n************************************Select集******************************\n\n");
for(int i=0; i<procNum; i++)
{
printf("Select[%d] = ",i+1);
for(int j=0;; j++)
{
if(select[i][j] == -1)
{
break;
}
printf("%s ",searchMapping(select[i][j]));
}
printf("\n");
}
}
//输出预測分析表
void MTable()
{
fstream outfile;
outfile.open("preciateTable.txt",ios::out);

for(int i=0; i<procNum; i++)
{
int m = 0;//非终结符的序号
for(int t=0; t<nonTerMap.size(); t++)
{
if(nonTerMap[t].second == proc[i+1][1])
{
m = t;
break;
}
}

for(int j=0;; j++)
{
if(select[i][j] == -1)
{
break;
}
for(int k=0; k<terMap.size(); k++)
{
if(terMap[k].second == select[i][j])
{
int n = 0;
for(n=1; n<=Max_Length2; n++)
{
M[m][k][n-1] = proc[i+1]
;
if(proc[i+1]
== -1)
{
break;
}
}
break;
}
}
}
}
//printf("\n*********************************预測分析表******************************\n\n");
outfile<<endl<<"*********************************预測分析表******************************"<<endl;
for(int i=0; i<nonTerMap.size(); i++)
{
for(int j=0; j<terMap.size(); j++)
{
outfile<<"M["<<nonTerMap[i].first<<"]["<<terMap[j].first<<"] = ";
//printf("M[%s][%s] = ",nonTerMap[i].first,terMap[j].first);
for(int k=0;; k++)
{
if(M[i][j][k] == -1)
{
break;
}
outfile<<searchMapping(M[i][j][k]);
//printf("%s ",searchMapping(M[i][j][k]));
}
outfile<<endl;
//printf("\n");
}
outfile<<endl<<endl;
//printf("\n\n");
}
outfile.close();
}

void InitStack(SeqStack *S)    /*初始化顺序栈*/
{
S->top = -1;
}
int Push(SeqStack *S,int x)   /*进栈*/
{
if(S->top ==Stack_Size-1)
return 0;
S->top++;
S->elem[S->top]=x;
return 1;
}
int Pop(SeqStack *S)   /*出栈*/
{
if(S->top==-1)
return 0;
else
{
S->top--;
return 1;
}
}
int GetTop(SeqStack *S,int *x)   /*取栈顶元素*/
{
if(S->top==-1)
return 0;
else
{
*x=S->elem[S->top];
return 1;
}
}
void ShowStack1(SeqStack *S)   /*显示栈的字符。先输出栈底元素*/
{

int i;
for(i=S->top; i>=0; i--)
{
//printf("%s ",searchMapping(S->elem[i]));
resultfile<<searchMapping(S->elem[i])<<" ";
}
}
void ShowStack2(SeqStack *S)   /*显示栈的字符,先输出栈顶元素*/
{

int i;
for(i=S->top; i>=0; i--)
{
//printf("%s ",searchMapping(S->elem[i]));
resultfile<<searchMapping(S->elem[i])<<" ";
}
}
//分析源程序
void Analysis()
{
//分析结果输出

resultfile.open("preciateResult.txt",ios::out);

SeqStack s1,s2;
int c1,c2;
int i = 0;
int reserve[Stack_Size];//符号栈反向入栈
NormalNode * p = normalHead;
int s1Length = 0;
memset(reserve,-1,sizeof(reserve));

InitStack(&s1);  /*初始化符号栈和输入串*/
InitStack(&s2);
Push(&s1,GRAMMAR_SPECIAL);
Push(&s1,proc[1][1]);
Push(&s2,GRAMMAR_SPECIAL);

p = p->next;
while(p!=NULL)
{

if(p->type == AUTO || p->type == CONST || p->type == UNSIGNED || p->type == SIGNED
|| p->type ==STATIC || p->type == VOLATILE )
{
reserve[i++] =  DESCRIBE;
//Push(&s2,DESCRIBE);
}
else if(p->type == INT_VAL)
{
reserve[i++] =  DIGIT;
//Push(&s2,DIGIT);
}
else if(p->type == CHAR || p->type == DOUBLE || p->type == FLOAT || p->type == INT ||
p->type == LONG || p->type == SHORT || p->type == VOID)
{
reserve[i++] =  TYPE;
//Push(&s2,TYPE);
}
else if(p->type == STRING_VAL)
{
reserve[i++] =  STRING;
//Push(&s2,STRING);
}
else if(p->type == DOU_QUE || p->type == SIN_QUE)
{

}
else
{
reserve[i++] =  p->type;
//Push(&s2,p->type);
}
p = p->next;
}
//求左边栈的长度
for(s1Length = 0;; s1Length++)
{
if(reserve[s1Length] == -1)
{
break;
}
}
//反向入栈
for(i = s1Length; i>0; i--)
{
Push(&s2,reserve[i-1]);
}

for(i=0;; i++)   /*分析*/
{
//getch();
int flag = 0;
int h1;
int h2;
//printf("第%d步:\n",i+1);  /*输出该步的相应信息*/
resultfile<<"第"<<i + 1<<"步"<<endl;
//printf("符号栈:");
resultfile<<"符号栈:";
ShowStack1(&s1);
//printf("\n");
resultfile<<endl;
//printf("输入栈:");
resultfile<<"输入栈:";
ShowStack2(&s2);
//printf("\n");
resultfile<<endl;

GetTop(&s1,&c1);   /*取栈顶元素,记为c1。c2*/
GetTop(&s2,&c2);
if(c1 == GRAMMAR_SPECIAL && c2 == GRAMMAR_SPECIAL)  /*当符号栈和输入栈都剩余#时。分析成功*/
{
//printf("成功!\n");
resultfile<<"成功!"<<endl;
break;
}
if(c1 == GRAMMAR_SPECIAL && c2!= GRAMMAR_SPECIAL)  /*当符号栈剩余#,而输入串未结束时。分析失败 */
{
//printf("失败!\n");
resultfile<<"失败!"<<endl;
break;
}
if(c1 == c2)/*符号栈的栈顶元素和输入串的栈顶元素同样时。同一时候弹出*/
{
Pop(&s1);
Pop(&s2);
flag = 1;
}

else /*查预測分析表*/
{
//记录下非终结符的位置
for(h1=0; h1<nonTerMap.size(); h1++)
{
if(nonTerMap[h1].second == c1)
{
break;
}
}
//记录下终结符的位置
for(h2=0; h2<terMap.size(); h2++)
{
if(terMap[h2].second == c2)
{
break;
}
}
if(M[h1][h2][0] == -1)
{
//printf("Error\n");
resultfile<<"Error"<<endl;
break;//假设错误的话,直接终止分析
}
else
{
int length = 0;
//记录下推导式的长度
for(length = 0;; length++)
{
if(M[h1][h2][length] == -1)
{
break;
}
}
Pop(&s1);
//假设不是空的话,反向入栈
if(M[h1][h2][2] != GRAMMAR_NULL)
{
for(int k = length-1; k>=2; k--)
{
Push(&s1,M[h1][h2][k]);
}
}
}
}
if(flag == 1)
{
//printf("匹配。\n");
resultfile<<"匹配!"<<endl;
}
else
{
resultfile<<"所用推出式:";
//printf("所用推出式:");
int w = 0;
//记录下推导式的长度
for(w = 0;; w++)
{
if(M[h1][h2][w] == -1)
{
break;
}
//printf("%s ",searchMapping(M[h1][h2][w]));
resultfile<<searchMapping(M[h1][h2][w]);
}
//printf("\n\n");
resultfile<<endl<<endl;
}
}
resultfile.close();
}


主文件:

main.cpp

//main.cpp
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include "LexAnalysis.h"
#include "SynAnalysis.h"

int main()
{
//词法分析部分
initKeyMapping();
initOperMapping();
initLimitMapping();
initNode();
scanner();
BraMappingError();
printNodeLink();

printErrorLink();
printIdentLink();

//语法分析部分
initGrammer();
First();
Follow();
Select();
MTable();
Analysis();
close();
return 0;
}


測试程序(被分析的C代码):

int main()
{
int i = 7;
int j = 9;
int c[20] =

{2,10,10,19,3,4,5,5,34,6,54,52,34,55,68,10,90,78,56,20};
for (i=0;i<20;i++)
{
for(j=i+1;j<20;j--)
{
if(j == 19)
{
c[i] = j;
}
}
}
printf("Hello world");
return 0;
}


分析结果:



************************************C语言文法******************************

<函数定义> -> <修饰词闭包> <类型> <变量> ( <參数声明> ) { <函数块> }
<修饰词闭包> -> <修饰词> <修饰词闭包>
<修饰词闭包> -> $
<修饰词> -> describe
<类型> -> type <取地址>
<取地址> -> <星号闭包>
<星号闭包> -> <星号> <星号闭包>
<星号闭包> -> $
<星号> -> *
<变量> -> <标志符> <数组下标>
<标志符> -> id
<数组下标> -> [ <因式> ]
<数组下标> -> $
<因式> -> ( <表达式> )
<因式> -> <变量>
<因式> -> <数字>
<数字> -> digit
<表达式> -> <因子> <项>
<因子> -> <因式> <因式递归>
<因式递归> -> * <因式> <因式递归>
<因式递归> -> / <因式> <因式递归>
<因式递归> -> $
<项> -> + <因子> <项>
<项> -> - <因子> <项>
<项> -> $
<參数声明> -> <声明> <声明闭包>
<參数声明> -> $
<声明> -> <修饰词闭包> <类型> <变量> <赋初值>
<赋初值> -> = <右值>
<赋初值> -> $
<右值> -> <表达式>
<右值> -> { <多个数据> }
<多个数据> -> <数字> <数字闭包>
<数字闭包> -> , <数字> <数字闭包>
<数字闭包> -> $
<声明闭包> -> , <声明> <声明闭包>
<声明闭包> -> $
<函数块> -> <声明语句闭包> <函数块闭包>
<声明语句闭包> -> <声明语句> <声明语句闭包>
<声明语句闭包> -> $
<声明语句> -> <声明> ;
<函数块闭包> -> <赋值函数> <函数块闭包>
<函数块闭包> -> <for循环> <函数块闭包>
<函数块闭包> -> <条件语句> <函数块闭包>
<函数块闭包> -> <函数返回> <函数块闭包>
<函数块闭包> -> $
<赋值函数> -> <变量> <赋值或函数调用>
<赋值或函数调用> -> = <右值> ;
<赋值或函数调用> -> ( <參数列表> ) ;
<參数列表> -> <參数> <參数闭包>
<參数闭包> -> , <參数> <參数闭包>
<參数闭包> -> $
<參数> -> <标志符>
<參数> -> <数字>
<參数> -> <字符串>
<字符串> -> string
<for循环> -> for ( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> }
<逻辑表达式> -> <表达式> <逻辑运算符> <表达式>
<逻辑运算符> -> <
<逻辑运算符> -> >
<逻辑运算符> -> ==
<逻辑运算符> -> !=
<后缀表达式> -> <变量> <后缀运算符>
<后缀运算符> -> ++
<后缀运算符> -> --
<条件语句> -> if ( <逻辑表达式> ) { <函数块> } <否则语句>
<否则语句> -> else { <函数块> }
<否则语句> -> $
<函数返回> -> return <因式> ;

************************************文法终结符******************************

( ) { } describe type * id [ ] digit / + - = , ; string for < > == != ++ -- if e
lse return

************************************文法非终结符******************************

<函数定义> <修饰词闭包> <类型> <变量> <參数声明> <函数块> <修饰词> <取地址> <星
号闭包> <星号> <标志符> <数组下标> <因式> <表达式> <数字> <因子> <项> <因式递归>
<声明> <声明闭包> <赋初值> <右值> <多个数据> <数字闭包> <声明语句闭包> <函数块
闭包> <声明语句> <赋值函数> <for循环> <条件语句> <函数返回> <赋值或函数调用> <參
数列表> <參数> <參数闭包> <字符串> <逻辑表达式> <后缀表达式> <逻辑运算符> <后缀
运算符> <否则语句>

************************************First集******************************

First[<函数定义>] = describe type
First[<修饰词闭包>] = describe $
First[<类型>] = type
First[<变量>] = id
First[<參数声明>] = describe type $
First[<函数块>] = describe type id for if return $
First[<修饰词>] = describe
First[<取地址>] = * $
First[<星号闭包>] = * $
First[<星号>] = *
First[<标志符>] = id
First[<数组下标>] = [ $
First[<因式>] = ( id digit
First[<表达式>] = ( id digit
First[<数字>] = digit
First[<因子>] = ( id digit
First[<项>] = + - $
First[<因式递归>] = * / $
First[<声明>] = describe type
First[<声明闭包>] = , $
First[<赋初值>] = = $
First[<右值>] = ( id digit {
First[<多个数据>] = digit
First[<数字闭包>] = , $
First[<声明语句闭包>] = describe type $
First[<函数块闭包>] = id for if return $
First[<声明语句>] = describe type
First[<赋值函数>] = id
First[<for循环>] = for
First[<条件语句>] = if
First[<函数返回>] = return
First[<赋值或函数调用>] = = (
First[<參数列表>] = id digit string
First[<參数>] = id digit string
First[<參数闭包>] = , $
First[<字符串>] = string
First[<逻辑表达式>] = ( id digit
First[<后缀表达式>] = id
First[<逻辑运算符>] = < > == !=
First[<后缀运算符>] = ++ --
First[<否则语句>] = else $

************************************Follow集******************************

Follow[<函数定义>] = #
Follow[<修饰词闭包>] = type
Follow[<类型>] = id
Follow[<变量>] = ( ] ) , ; < > == != + - * / = ++ --
Follow[<參数声明>] = )
Follow[<函数块>] = }
Follow[<修饰词>] = type describe
Follow[<取地址>] = id
Follow[<星号闭包>] = id
Follow[<星号>] = id *
Follow[<标志符>] = ( ] ) , ; < > == != + - * / = ++ -- [
Follow[<数组下标>] = ( ] ) , ; < > == != + - * / = ++ --
Follow[<因式>] = ] ) , ; < > == != + - * /
Follow[<表达式>] = ) , ; < > == !=
Follow[<数字>] = ] ) , ; < > == != + - * / }
Follow[<因子>] = ) , ; < > == != + -
Follow[<项>] = ) , ; < > == !=
Follow[<因式递归>] = ) , ; < > == != + -
Follow[<声明>] = ) , ;
Follow[<声明闭包>] = )
Follow[<赋初值>] = ) , ;
Follow[<右值>] = ) , ;
Follow[<多个数据>] = }
Follow[<数字闭包>] = }
Follow[<声明语句闭包>] = } id for if return
Follow[<函数块闭包>] = }
Follow[<声明语句>] = } id for if return describe type
Follow[<赋值函数>] = } id for if return ( digit
Follow[<for循环>] = } id for if return
Follow[<条件语句>] = } id for if return
Follow[<函数返回>] = } id for if return
Follow[<赋值或函数调用>] = } id for if return ( digit
Follow[<參数列表>] = )
Follow[<參数>] = ) ,
Follow[<參数闭包>] = )
Follow[<字符串>] = ) ,
Follow[<逻辑表达式>] = ; )
Follow[<后缀表达式>] = )
Follow[<逻辑运算符>] = ( id digit
Follow[<后缀运算符>] = )
Follow[<否则语句>] = } id for if return

************************************Select集******************************

Select[1] = describe type
Select[2] = describe
Select[3] = type
Select[4] = describe
Select[5] = type
Select[6] = * id
Select[7] = *
Select[8] = id
Select[9] = *
Select[10] = id
Select[11] = id
Select[12] = [
Select[13] = ( ] ) , ; < > == != + - * / = ++ --
Select[14] = (
Select[15] = id
Select[16] = digit
Select[17] = digit
Select[18] = ( id digit
Select[19] = ( id digit
Select[20] = *
Select[21] = /
Select[22] = ) , ; < > == != + -
Select[23] = +
Select[24] = -
Select[25] = ) , ; < > == !=
Select[26] = describe type
Select[27] = )
Select[28] = describe type
Select[29] = =
Select[30] = ) , ;
Select[31] = ( id digit
Select[32] = {
Select[33] = digit
Select[34] = ,
Select[35] = }
Select[36] = ,
Select[37] = )
Select[38] = describe type id for if return }
Select[39] = describe type
Select[40] = } id for if return
Select[41] = describe type
Select[42] = id
Select[43] = for
Select[44] = if
Select[45] = return
Select[46] = }
Select[47] = id
Select[48] = =
Select[49] = (
Select[50] = id digit string
Select[51] = ,
Select[52] = )
Select[53] = id
Select[54] = digit
Select[55] = string
Select[56] = string
Select[57] = for
Select[58] = ( id digit
Select[59] = <
Select[60] = >
Select[61] = ==
Select[62] = !=
Select[63] = id
Select[64] = ++
Select[65] = --
Select[66] = if
Select[67] = else
Select[68] = } id for if return
Select[69] = return

Process returned 0 (0x0)   execution time : 4.317 s
Press any key to continue.


输出文件内容:

preciateTable.txt(预測分析表):

*********************************预測分析表******************************
M[<函数定义>][(] =
M[<函数定义>][)] =
M[<函数定义>][{] =
M[<函数定义>][}] =
M[<函数定义>][describe] = <函数定义>-><修饰词闭包><类型><变量>(<參数声明>){<函数块>}
M[<函数定义>][type] = <函数定义>-><修饰词闭包><类型><变量>(<參数声明>){<函数块>}
M[<函数定义>][*] =
M[<函数定义>][id] =
M[<函数定义>][[] =
M[<函数定义>][]] =
M[<函数定义>][digit] =
M[<函数定义>][/] =
M[<函数定义>][+] =
M[<函数定义>][-] =
M[<函数定义>][=] =
M[<函数定义>][,] =
M[<函数定义>][;] =
M[<函数定义>][string] =
M[<函数定义>][for] =
M[<函数定义>][<] =
M[<函数定义>][>] =
M[<函数定义>][==] =
M[<函数定义>][!=] =
M[<函数定义>][++] =
M[<函数定义>][--] =
M[<函数定义>][if] =
M[<函数定义>][else] =
M[<函数定义>][return] =

M[<修饰词闭包>][(] =
M[<修饰词闭包>][)] =
M[<修饰词闭包>][{] =
M[<修饰词闭包>][}] =
M[<修饰词闭包>][describe] = <修饰词闭包>-><修饰词><修饰词闭包>
M[<修饰词闭包>][type] = <修饰词闭包>->$
M[<修饰词闭包>][*] =
M[<修饰词闭包>][id] =
M[<修饰词闭包>][[] =
M[<修饰词闭包>][]] =
M[<修饰词闭包>][digit] =
M[<修饰词闭包>][/] =
M[<修饰词闭包>][+] =
M[<修饰词闭包>][-] =
M[<修饰词闭包>][=] =
M[<修饰词闭包>][,] =
M[<修饰词闭包>][;] =
M[<修饰词闭包>][string] =
M[<修饰词闭包>][for] =
M[<修饰词闭包>][<] =
M[<修饰词闭包>][>] =
M[<修饰词闭包>][==] =
M[<修饰词闭包>][!=] =
M[<修饰词闭包>][++] =
M[<修饰词闭包>][--] =
M[<修饰词闭包>][if] =
M[<修饰词闭包>][else] =
M[<修饰词闭包>][return] =

M[<类型>][(] =
M[<类型>][)] =
M[<类型>][{] =
M[<类型>][}] =
M[<类型>][describe] =
M[<类型>][type] = <类型>->type<取地址>
M[<类型>][*] =
M[<类型>][id] =
M[<类型>][[] =
M[<类型>][]] =
M[<类型>][digit] =
M[<类型>][/] =
M[<类型>][+] =
M[<类型>][-] =
M[<类型>][=] =
M[<类型>][,] =
M[<类型>][;] =
M[<类型>][string] =
M[<类型>][for] =
M[<类型>][<] =
M[<类型>][>] =
M[<类型>][==] =
M[<类型>][!=] =
M[<类型>][++] =
M[<类型>][--] =
M[<类型>][if] =
M[<类型>][else] =
M[<类型>][return] =

M[<变量>][(] =
M[<变量>][)] =
M[<变量>][{] =
M[<变量>][}] =
M[<变量>][describe] =
M[<变量>][type] =
M[<变量>][*] =
M[<变量>][id] = <变量>-><标志符><数组下标>
M[<变量>][[] =
M[<变量>][]] =
M[<变量>][digit] =
M[<变量>][/] =
M[<变量>][+] =
M[<变量>][-] =
M[<变量>][=] =
M[<变量>][,] =
M[<变量>][;] =
M[<变量>][string] =
M[<变量>][for] =
M[<变量>][<] =
M[<变量>][>] =
M[<变量>][==] =
M[<变量>][!=] =
M[<变量>][++] =
M[<变量>][--] =
M[<变量>][if] =
M[<变量>][else] =
M[<变量>][return] =

M[<參数声明>][(] =
M[<參数声明>][)] = <參数声明>->$
M[<參数声明>][{] =
M[<參数声明>][}] =
M[<參数声明>][describe] = <參数声明>-><声明><声明闭包>
M[<參数声明>][type] = <參数声明>-><声明><声明闭包>
M[<參数声明>][*] =
M[<參数声明>][id] =
M[<參数声明>][[] =
M[<參数声明>][]] =
M[<參数声明>][digit] =
M[<參数声明>][/] =
M[<參数声明>][+] =
M[<參数声明>][-] =
M[<參数声明>][=] =
M[<參数声明>][,] =
M[<參数声明>][;] =
M[<參数声明>][string] =
M[<參数声明>][for] =
M[<參数声明>][<] =
M[<參数声明>][>] =
M[<參数声明>][==] =
M[<參数声明>][!=] =
M[<參数声明>][++] =
M[<參数声明>][--] =
M[<參数声明>][if] =
M[<參数声明>][else] =
M[<參数声明>][return] =

M[<函数块>][(] =
M[<函数块>][)] =
M[<函数块>][{] =
M[<函数块>][}] = <函数块>-><声明语句闭包><函数块闭包>
M[<函数块>][describe] = <函数块>-><声明语句闭包><函数块闭包>
M[<函数块>][type] = <函数块>-><声明语句闭包><函数块闭包>
M[<函数块>][*] =
M[<函数块>][id] = <函数块>-><声明语句闭包><函数块闭包>
M[<函数块>][[] =
M[<函数块>][]] =
M[<函数块>][digit] =
M[<函数块>][/] =
M[<函数块>][+] =
M[<函数块>][-] =
M[<函数块>][=] =
M[<函数块>][,] =
M[<函数块>][;] =
M[<函数块>][string] =
M[<函数块>][for] = <函数块>-><声明语句闭包><函数块闭包>
M[<函数块>][<] =
M[<函数块>][>] =
M[<函数块>][==] =
M[<函数块>][!=] =
M[<函数块>][++] =
M[<函数块>][--] =
M[<函数块>][if] = <函数块>-><声明语句闭包><函数块闭包>
M[<函数块>][else] =
M[<函数块>][return] = <函数块>-><声明语句闭包><函数块闭包>

M[<修饰词>][(] =
M[<修饰词>][)] =
M[<修饰词>][{] =
M[<修饰词>][}] =
M[<修饰词>][describe] = <修饰词>->describe
M[<修饰词>][type] =
M[<修饰词>][*] =
M[<修饰词>][id] =
M[<修饰词>][[] =
M[<修饰词>][]] =
M[<修饰词>][digit] =
M[<修饰词>][/] =
M[<修饰词>][+] =
M[<修饰词>][-] =
M[<修饰词>][=] =
M[<修饰词>][,] =
M[<修饰词>][;] =
M[<修饰词>][string] =
M[<修饰词>][for] =
M[<修饰词>][<] =
M[<修饰词>][>] =
M[<修饰词>][==] =
M[<修饰词>][!=] =
M[<修饰词>][++] =
M[<修饰词>][--] =
M[<修饰词>][if] =
M[<修饰词>][else] =
M[<修饰词>][return] =

M[<取地址>][(] =
M[<取地址>][)] =
M[<取地址>][{] =
M[<取地址>][}] =
M[<取地址>][describe] =
M[<取地址>][type] =
M[<取地址>][*] = <取地址>-><星号闭包>
M[<取地址>][id] = <取地址>-><星号闭包>
M[<取地址>][[] =
M[<取地址>][]] =
M[<取地址>][digit] =
M[<取地址>][/] =
M[<取地址>][+] =
M[<取地址>][-] =
M[<取地址>][=] =
M[<取地址>][,] =
M[<取地址>][;] =
M[<取地址>][string] =
M[<取地址>][for] =
M[<取地址>][<] =
M[<取地址>][>] =
M[<取地址>][==] =
M[<取地址>][!=] =
M[<取地址>][++] =
M[<取地址>][--] =
M[<取地址>][if] =
M[<取地址>][else] =
M[<取地址>][return] =

M[<星号闭包>][(] =
M[<星号闭包>][)] =
M[<星号闭包>][{] =
M[<星号闭包>][}] =
M[<星号闭包>][describe] =
M[<星号闭包>][type] =
M[<星号闭包>][*] = <星号闭包>-><星号><星号闭包>
M[<星号闭包>][id] = <星号闭包>->$
M[<星号闭包>][[] =
M[<星号闭包>][]] =
M[<星号闭包>][digit] =
M[<星号闭包>][/] =
M[<星号闭包>][+] =
M[<星号闭包>][-] =
M[<星号闭包>][=] =
M[<星号闭包>][,] =
M[<星号闭包>][;] =
M[<星号闭包>][string] =
M[<星号闭包>][for] =
M[<星号闭包>][<] =
M[<星号闭包>][>] =
M[<星号闭包>][==] =
M[<星号闭包>][!=] =
M[<星号闭包>][++] =
M[<星号闭包>][--] =
M[<星号闭包>][if] =
M[<星号闭包>][else] =
M[<星号闭包>][return] =

M[<星号>][(] =
M[<星号>][)] =
M[<星号>][{] =
M[<星号>][}] =
M[<星号>][describe] =
M[<星号>][type] =
M[<星号>][*] = <星号>->*
M[<星号>][id] =
M[<星号>][[] =
M[<星号>][]] =
M[<星号>][digit] =
M[<星号>][/] =
M[<星号>][+] =
M[<星号>][-] =
M[<星号>][=] =
M[<星号>][,] =
M[<星号>][;] =
M[<星号>][string] =
M[<星号>][for] =
M[<星号>][<] =
M[<星号>][>] =
M[<星号>][==] =
M[<星号>][!=] =
M[<星号>][++] =
M[<星号>][--] =
M[<星号>][if] =
M[<星号>][else] =
M[<星号>][return] =

M[<标志符>][(] =
M[<标志符>][)] =
M[<标志符>][{] =
M[<标志符>][}] =
M[<标志符>][describe] =
M[<标志符>][type] =
M[<标志符>][*] =
M[<标志符>][id] = <标志符>->id
M[<标志符>][[] =
M[<标志符>][]] =
M[<标志符>][digit] =
M[<标志符>][/] =
M[<标志符>][+] =
M[<标志符>][-] =
M[<标志符>][=] =
M[<标志符>][,] =
M[<标志符>][;] =
M[<标志符>][string] =
M[<标志符>][for] =
M[<标志符>][<] =
M[<标志符>][>] =
M[<标志符>][==] =
M[<标志符>][!=] =
M[<标志符>][++] =
M[<标志符>][--] =
M[<标志符>][if] =
M[<标志符>][else] =
M[<标志符>][return] =

M[<数组下标>][(] = <数组下标>->$
M[<数组下标>][)] = <数组下标>->$
M[<数组下标>][{] =
M[<数组下标>][}] =
M[<数组下标>][describe] =
M[<数组下标>][type] =
M[<数组下标>][*] = <数组下标>->$
M[<数组下标>][id] =
M[<数组下标>][[] = <数组下标>->[<因式>]
M[<数组下标>][]] = <数组下标>->$
M[<数组下标>][digit] =
M[<数组下标>][/] = <数组下标>->$
M[<数组下标>][+] = <数组下标>->$
M[<数组下标>][-] = <数组下标>->$
M[<数组下标>][=] = <数组下标>->$
M[<数组下标>][,] = <数组下标>->$
M[<数组下标>][;] = <数组下标>->$
M[<数组下标>][string] =
M[<数组下标>][for] =
M[<数组下标>][<] = <数组下标>->$
M[<数组下标>][>] = <数组下标>->$
M[<数组下标>][==] = <数组下标>->$
M[<数组下标>][!=] = <数组下标>->$
M[<数组下标>][++] = <数组下标>->$
M[<数组下标>][--] = <数组下标>->$
M[<数组下标>][if] =
M[<数组下标>][else] =
M[<数组下标>][return] =

M[<因式>][(] = <因式>->(<表达式>)
M[<因式>][)] =
M[<因式>][{] =
M[<因式>][}] =
M[<因式>][describe] =
M[<因式>][type] =
M[<因式>][*] =
M[<因式>][id] = <因式>-><变量>
M[<因式>][[] =
M[<因式>][]] =
M[<因式>][digit] = <因式>-><数字>
M[<因式>][/] =
M[<因式>][+] =
M[<因式>][-] =
M[<因式>][=] =
M[<因式>][,] =
M[<因式>][;] =
M[<因式>][string] =
M[<因式>][for] =
M[<因式>][<] =
M[<因式>][>] =
M[<因式>][==] =
M[<因式>][!=] =
M[<因式>][++] =
M[<因式>][--] =
M[<因式>][if] =
M[<因式>][else] =
M[<因式>][return] =

M[<表达式>][(] = <表达式>-><因子><项>
M[<表达式>][)] =
M[<表达式>][{] =
M[<表达式>][}] =
M[<表达式>][describe] =
M[<表达式>][type] =
M[<表达式>][*] =
M[<表达式>][id] = <表达式>-><因子><项>
M[<表达式>][[] =
M[<表达式>][]] =
M[<表达式>][digit] = <表达式>-><因子><项>
M[<表达式>][/] =
M[<表达式>][+] =
M[<表达式>][-] =
M[<表达式>][=] =
M[<表达式>][,] =
M[<表达式>][;] =
M[<表达式>][string] =
M[<表达式>][for] =
M[<表达式>][<] =
M[<表达式>][>] =
M[<表达式>][==] =
M[<表达式>][!=] =
M[<表达式>][++] =
M[<表达式>][--] =
M[<表达式>][if] =
M[<表达式>][else] =
M[<表达式>][return] =

M[<数字>][(] =
M[<数字>][)] =
M[<数字>][{] =
M[<数字>][}] =
M[<数字>][describe] =
M[<数字>][type] =
M[<数字>][*] =
M[<数字>][id] =
M[<数字>][[] =
M[<数字>][]] =
M[<数字>][digit] = <数字>->digit
M[<数字>][/] =
M[<数字>][+] =
M[<数字>][-] =
M[<数字>][=] =
M[<数字>][,] =
M[<数字>][;] =
M[<数字>][string] =
M[<数字>][for] =
M[<数字>][<] =
M[<数字>][>] =
M[<数字>][==] =
M[<数字>][!=] =
M[<数字>][++] =
M[<数字>][--] =
M[<数字>][if] =
M[<数字>][else] =
M[<数字>][return] =

M[<因子>][(] = <因子>-><因式><因式递归>
M[<因子>][)] =
M[<因子>][{] =
M[<因子>][}] =
M[<因子>][describe] =
M[<因子>][type] =
M[<因子>][*] =
M[<因子>][id] = <因子>-><因式><因式递归>
M[<因子>][[] =
M[<因子>][]] =
M[<因子>][digit] = <因子>-><因式><因式递归>
M[<因子>][/] =
M[<因子>][+] =
M[<因子>][-] =
M[<因子>][=] =
M[<因子>][,] =
M[<因子>][;] =
M[<因子>][string] =
M[<因子>][for] =
M[<因子>][<] =
M[<因子>][>] =
M[<因子>][==] =
M[<因子>][!=] =
M[<因子>][++] =
M[<因子>][--] =
M[<因子>][if] =
M[<因子>][else] =
M[<因子>][return] =

M[<项>][(] =
M[<项>][)] = <项>->$
M[<项>][{] =
M[<项>][}] =
M[<项>][describe] =
M[<项>][type] =
M[<项>][*] =
M[<项>][id] =
M[<项>][[] =
M[<项>][]] =
M[<项>][digit] =
M[<项>][/] =
M[<项>][+] = <项>->+<因子><项>
M[<项>][-] = <项>->-<因子><项>
M[<项>][=] =
M[<项>][,] = <项>->$
M[<项>][;] = <项>->$
M[<项>][string] =
M[<项>][for] =
M[<项>][<] = <项>->$
M[<项>][>] = <项>->$
M[<项>][==] = <项>->$
M[<项>][!=] = <项>->$
M[<项>][++] =
M[<项>][--] =
M[<项>][if] =
M[<项>][else] =
M[<项>][return] =

M[<因式递归>][(] =
M[<因式递归>][)] = <因式递归>->$
M[<因式递归>][{] =
M[<因式递归>][}] =
M[<因式递归>][describe] =
M[<因式递归>][type] =
M[<因式递归>][*] = <因式递归>->*<因式><因式递归>
M[<因式递归>][id] =
M[<因式递归>][[] =
M[<因式递归>][]] =
M[<因式递归>][digit] =
M[<因式递归>][/] = <因式递归>->/<因式><因式递归>
M[<因式递归>][+] = <因式递归>->$
M[<因式递归>][-] = <因式递归>->$
M[<因式递归>][=] =
M[<因式递归>][,] = <因式递归>->$
M[<因式递归>][;] = <因式递归>->$
M[<因式递归>][string] =
M[<因式递归>][for] =
M[<因式递归>][<] = <因式递归>->$
M[<因式递归>][>] = <因式递归>->$
M[<因式递归>][==] = <因式递归>->$
M[<因式递归>][!=] = <因式递归>->$
M[<因式递归>][++] =
M[<因式递归>][--] =
M[<因式递归>][if] =
M[<因式递归>][else] =
M[<因式递归>][return] =

M[<声明>][(] =
M[<声明>][)] =
M[<声明>][{] =
M[<声明>][}] =
M[<声明>][describe] = <声明>-><修饰词闭包><类型><变量><赋初值>
M[<声明>][type] = <声明>-><修饰词闭包><类型><变量><赋初值>
M[<声明>][*] =
M[<声明>][id] =
M[<声明>][[] =
M[<声明>][]] =
M[<声明>][digit] =
M[<声明>][/] =
M[<声明>][+] =
M[<声明>][-] =
M[<声明>][=] =
M[<声明>][,] =
M[<声明>][;] =
M[<声明>][string] =
M[<声明>][for] =
M[<声明>][<] =
M[<声明>][>] =
M[<声明>][==] =
M[<声明>][!=] =
M[<声明>][++] =
M[<声明>][--] =
M[<声明>][if] =
M[<声明>][else] =
M[<声明>][return] =

M[<声明闭包>][(] =
M[<声明闭包>][)] = <声明闭包>->$
M[<声明闭包>][{] =
M[<声明闭包>][}] =
M[<声明闭包>][describe] =
M[<声明闭包>][type] =
M[<声明闭包>][*] =
M[<声明闭包>][id] =
M[<声明闭包>][[] =
M[<声明闭包>][]] =
M[<声明闭包>][digit] =
M[<声明闭包>][/] =
M[<声明闭包>][+] =
M[<声明闭包>][-] =
M[<声明闭包>][=] =
M[<声明闭包>][,] = <声明闭包>->,<声明><声明闭包>
M[<声明闭包>][;] =
M[<声明闭包>][string] =
M[<声明闭包>][for] =
M[<声明闭包>][<] =
M[<声明闭包>][>] =
M[<声明闭包>][==] =
M[<声明闭包>][!=] =
M[<声明闭包>][++] =
M[<声明闭包>][--] =
M[<声明闭包>][if] =
M[<声明闭包>][else] =
M[<声明闭包>][return] =

M[<赋初值>][(] =
M[<赋初值>][)] = <赋初值>->$
M[<赋初值>][{] =
M[<赋初值>][}] =
M[<赋初值>][describe] =
M[<赋初值>][type] =
M[<赋初值>][*] =
M[<赋初值>][id] =
M[<赋初值>][[] =
M[<赋初值>][]] =
M[<赋初值>][digit] =
M[<赋初值>][/] =
M[<赋初值>][+] =
M[<赋初值>][-] =
M[<赋初值>][=] = <赋初值>->=<右值>
M[<赋初值>][,] = <赋初值>->$
M[<赋初值>][;] = <赋初值>->$
M[<赋初值>][string] =
M[<赋初值>][for] =
M[<赋初值>][<] =
M[<赋初值>][>] =
M[<赋初值>][==] =
M[<赋初值>][!=] =
M[<赋初值>][++] =
M[<赋初值>][--] =
M[<赋初值>][if] =
M[<赋初值>][else] =
M[<赋初值>][return] =

M[<右值>][(] = <右值>-><表达式>
M[<右值>][)] =
M[<右值>][{] = <右值>->{<多个数据>}
M[<右值>][}] =
M[<右值>][describe] =
M[<右值>][type] =
M[<右值>][*] =
M[<右值>][id] = <右值>-><表达式>
M[<右值>][[] =
M[<右值>][]] =
M[<右值>][digit] = <右值>-><表达式>
M[<右值>][/] =
M[<右值>][+] =
M[<右值>][-] =
M[<右值>][=] =
M[<右值>][,] =
M[<右值>][;] =
M[<右值>][string] =
M[<右值>][for] =
M[<右值>][<] =
M[<右值>][>] =
M[<右值>][==] =
M[<右值>][!=] =
M[<右值>][++] =
M[<右值>][--] =
M[<右值>][if] =
M[<右值>][else] =
M[<右值>][return] =

M[<多个数据>][(] =
M[<多个数据>][)] =
M[<多个数据>][{] =
M[<多个数据>][}] =
M[<多个数据>][describe] =
M[<多个数据>][type] =
M[<多个数据>][*] =
M[<多个数据>][id] =
M[<多个数据>][[] =
M[<多个数据>][]] =
M[<多个数据>][digit] = <多个数据>-><数字><数字闭包>
M[<多个数据>][/] =
M[<多个数据>][+] =
M[<多个数据>][-] =
M[<多个数据>][=] =
M[<多个数据>][,] =
M[<多个数据>][;] =
M[<多个数据>][string] =
M[<多个数据>][for] =
M[<多个数据>][<] =
M[<多个数据>][>] =
M[<多个数据>][==] =
M[<多个数据>][!=] =
M[<多个数据>][++] =
M[<多个数据>][--] =
M[<多个数据>][if] =
M[<多个数据>][else] =
M[<多个数据>][return] =

M[<数字闭包>][(] =
M[<数字闭包>][)] =
M[<数字闭包>][{] =
M[<数字闭包>][}] = <数字闭包>->$
M[<数字闭包>][describe] =
M[<数字闭包>][type] =
M[<数字闭包>][*] =
M[<数字闭包>][id] =
M[<数字闭包>][[] =
M[<数字闭包>][]] =
M[<数字闭包>][digit] =
M[<数字闭包>][/] =
M[<数字闭包>][+] =
M[<数字闭包>][-] =
M[<数字闭包>][=] =
M[<数字闭包>][,] = <数字闭包>->,<数字><数字闭包>
M[<数字闭包>][;] =
M[<数字闭包>][string] =
M[<数字闭包>][for] =
M[<数字闭包>][<] =
M[<数字闭包>][>] =
M[<数字闭包>][==] =
M[<数字闭包>][!=] =
M[<数字闭包>][++] =
M[<数字闭包>][--] =
M[<数字闭包>][if] =
M[<数字闭包>][else] =
M[<数字闭包>][return] =

M[<声明语句闭包>][(] =
M[<声明语句闭包>][)] =
M[<声明语句闭包>][{] =
M[<声明语句闭包>][}] = <声明语句闭包>->$
M[<声明语句闭包>][describe] = <声明语句闭包>-><声明语句><声明语句闭包>
M[<声明语句闭包>][type] = <声明语句闭包>-><声明语句><声明语句闭包>
M[<声明语句闭包>][*] =
M[<声明语句闭包>][id] = <声明语句闭包>->$
M[<声明语句闭包>][[] =
M[<声明语句闭包>][]] =
M[<声明语句闭包>][digit] =
M[<声明语句闭包>][/] =
M[<声明语句闭包>][+] =
M[<声明语句闭包>][-] =
M[<声明语句闭包>][=] =
M[<声明语句闭包>][,] =
M[<声明语句闭包>][;] =
M[<声明语句闭包>][string] =
M[<声明语句闭包>][for] = <声明语句闭包>->$
M[<声明语句闭包>][<] =
M[<声明语句闭包>][>] =
M[<声明语句闭包>][==] =
M[<声明语句闭包>][!=] =
M[<声明语句闭包>][++] =
M[<声明语句闭包>][--] =
M[<声明语句闭包>][if] = <声明语句闭包>->$
M[<声明语句闭包>][else] =
M[<声明语句闭包>][return] = <声明语句闭包>->$

M[<函数块闭包>][(] =
M[<函数块闭包>][)] =
M[<函数块闭包>][{] =
M[<函数块闭包>][}] = <函数块闭包>->$
M[<函数块闭包>][describe] =
M[<函数块闭包>][type] =
M[<函数块闭包>][*] =
M[<函数块闭包>][id] = <函数块闭包>-><赋值函数><函数块闭包>
M[<函数块闭包>][[] =
M[<函数块闭包>][]] =
M[<函数块闭包>][digit] =
M[<函数块闭包>][/] =
M[<函数块闭包>][+] =
M[<函数块闭包>][-] =
M[<函数块闭包>][=] =
M[<函数块闭包>][,] =
M[<函数块闭包>][;] =
M[<函数块闭包>][string] =
M[<函数块闭包>][for] = <函数块闭包>-><for循环><函数块闭包>
M[<函数块闭包>][<] =
M[<函数块闭包>][>] =
M[<函数块闭包>][==] =
M[<函数块闭包>][!=] =
M[<函数块闭包>][++] =
M[<函数块闭包>][--] =
M[<函数块闭包>][if] = <函数块闭包>-><条件语句><函数块闭包>
M[<函数块闭包>][else] =
M[<函数块闭包>][return] = <函数块闭包>-><函数返回><函数块闭包>

M[<声明语句>][(] =
M[<声明语句>][)] =
M[<声明语句>][{] =
M[<声明语句>][}] =
M[<声明语句>][describe] = <声明语句>-><声明>;
M[<声明语句>][type] = <声明语句>-><声明>;
M[<声明语句>][*] =
M[<声明语句>][id] =
M[<声明语句>][[] =
M[<声明语句>][]] =
M[<声明语句>][digit] =
M[<声明语句>][/] =
M[<声明语句>][+] =
M[<声明语句>][-] =
M[<声明语句>][=] =
M[<声明语句>][,] =
M[<声明语句>][;] =
M[<声明语句>][string] =
M[<声明语句>][for] =
M[<声明语句>][<] =
M[<声明语句>][>] =
M[<声明语句>][==] =
M[<声明语句>][!=] =
M[<声明语句>][++] =
M[<声明语句>][--] =
M[<声明语句>][if] =
M[<声明语句>][else] =
M[<声明语句>][return] =

M[<赋值函数>][(] =
M[<赋值函数>][)] =
M[<赋值函数>][{] =
M[<赋值函数>][}] =
M[<赋值函数>][describe] =
M[<赋值函数>][type] =
M[<赋值函数>][*] =
M[<赋值函数>][id] = <赋值函数>-><变量><赋值或函数调用>
M[<赋值函数>][[] =
M[<赋值函数>][]] =
M[<赋值函数>][digit] =
M[<赋值函数>][/] =
M[<赋值函数>][+] =
M[<赋值函数>][-] =
M[<赋值函数>][=] =
M[<赋值函数>][,] =
M[<赋值函数>][;] =
M[<赋值函数>][string] =
M[<赋值函数>][for] =
M[<赋值函数>][<] =
M[<赋值函数>][>] =
M[<赋值函数>][==] =
M[<赋值函数>][!=] =
M[<赋值函数>][++] =
M[<赋值函数>][--] =
M[<赋值函数>][if] =
M[<赋值函数>][else] =
M[<赋值函数>][return] =

M[<for循环>][(] =
M[<for循环>][)] =
M[<for循环>][{] =
M[<for循环>][}] =
M[<for循环>][describe] =
M[<for循环>][type] =
M[<for循环>][*] =
M[<for循环>][id] =
M[<for循环>][[] =
M[<for循环>][]] =
M[<for循环>][digit] =
M[<for循环>][/] =
M[<for循环>][+] =
M[<for循环>][-] =
M[<for循环>][=] =
M[<for循环>][,] =
M[<for循环>][;] =
M[<for循环>][string] =
M[<for循环>][for] = <for循环>->for(<赋值函数><逻辑表达式>;<后缀表达式>){<函数块>}
M[<for循环>][<] =
M[<for循环>][>] =
M[<for循环>][==] =
M[<for循环>][!=] =
M[<for循环>][++] =
M[<for循环>][--] =
M[<for循环>][if] =
M[<for循环>][else] =
M[<for循环>][return] =

M[<条件语句>][(] =
M[<条件语句>][)] =
M[<条件语句>][{] =
M[<条件语句>][}] =
M[<条件语句>][describe] =
M[<条件语句>][type] =
M[<条件语句>][*] =
M[<条件语句>][id] =
M[<条件语句>][[] =
M[<条件语句>][]] =
M[<条件语句>][digit] =
M[<条件语句>][/] =
M[<条件语句>][+] =
M[<条件语句>][-] =
M[<条件语句>][=] =
M[<条件语句>][,] =
M[<条件语句>][;] =
M[<条件语句>][string] =
M[<条件语句>][for] =
M[<条件语句>][<] =
M[<条件语句>][>] =
M[<条件语句>][==] =
M[<条件语句>][!=] =
M[<条件语句>][++] =
M[<条件语句>][--] =
M[<条件语句>][if] = <条件语句>->if(<逻辑表达式>){<函数块>}<否则语句>
M[<条件语句>][else] =
M[<条件语句>][return] =

M[<函数返回>][(] =
M[<函数返回>][)] =
M[<函数返回>][{] =
M[<函数返回>][}] =
M[<函数返回>][describe] =
M[<函数返回>][type] =
M[<函数返回>][*] =
M[<函数返回>][id] =
M[<函数返回>][[] =
M[<函数返回>][]] =
M[<函数返回>][digit] =
M[<函数返回>][/] =
M[<函数返回>][+] =
M[<函数返回>][-] =
M[<函数返回>][=] =
M[<函数返回>][,] =
M[<函数返回>][;] =
M[<函数返回>][string] =
M[<函数返回>][for] =
M[<函数返回>][<] =
M[<函数返回>][>] =
M[<函数返回>][==] =
M[<函数返回>][!=] =
M[<函数返回>][++] =
M[<函数返回>][--] =
M[<函数返回>][if] =
M[<函数返回>][else] =
M[<函数返回>][return] = <函数返回>->return<因式>;

M[<赋值或函数调用>][(] = <赋值或函数调用>->(<參数列表>);
M[<赋值或函数调用>][)] =
M[<赋值或函数调用>][{] =
M[<赋值或函数调用>][}] =
M[<赋值或函数调用>][describe] =
M[<赋值或函数调用>][type] =
M[<赋值或函数调用>][*] =
M[<赋值或函数调用>][id] =
M[<赋值或函数调用>][[] =
M[<赋值或函数调用>][]] =
M[<赋值或函数调用>][digit] =
M[<赋值或函数调用>][/] =
M[<赋值或函数调用>][+] =
M[<赋值或函数调用>][-] =
M[<赋值或函数调用>][=] = <赋值或函数调用>->=<右值>;
M[<赋值或函数调用>][,] =
M[<赋值或函数调用>][;] =
M[<赋值或函数调用>][string] =
M[<赋值或函数调用>][for] =
M[<赋值或函数调用>][<] =
M[<赋值或函数调用>][>] =
M[<赋值或函数调用>][==] =
M[<赋值或函数调用>][!=] =
M[<赋值或函数调用>][++] =
M[<赋值或函数调用>][--] =
M[<赋值或函数调用>][if] =
M[<赋值或函数调用>][else] =
M[<赋值或函数调用>][return] =

M[<參数列表>][(] =
M[<參数列表>][)] =
M[<參数列表>][{] =
M[<參数列表>][}] =
M[<參数列表>][describe] =
M[<參数列表>][type] =
M[<參数列表>][*] =
M[<參数列表>][id] = <參数列表>-><參数><參数闭包>
M[<參数列表>][[] =
M[<參数列表>][]] =
M[<參数列表>][digit] = <參数列表>-><參数><參数闭包>
M[<參数列表>][/] =
M[<參数列表>][+] =
M[<參数列表>][-] =
M[<參数列表>][=] =
M[<參数列表>][,] =
M[<參数列表>][;] =
M[<參数列表>][string] = <參数列表>-><參数><參数闭包>
M[<參数列表>][for] =
M[<參数列表>][<] =
M[<參数列表>][>] =
M[<參数列表>][==] =
M[<參数列表>][!=] =
M[<參数列表>][++] =
M[<參数列表>][--] =
M[<參数列表>][if] =
M[<參数列表>][else] =
M[<參数列表>][return] =

M[<參数>][(] =
M[<參数>][)] =
M[<參数>][{] =
M[<參数>][}] =
M[<參数>][describe] =
M[<參数>][type] =
M[<參数>][*] =
M[<參数>][id] = <參数>-><标志符>
M[<參数>][[] =
M[<參数>][]] =
M[<參数>][digit] = <參数>-><数字>
M[<參数>][/] =
M[<參数>][+] =
M[<參数>][-] =
M[<參数>][=] =
M[<參数>][,] =
M[<參数>][;] =
M[<參数>][string] = <參数>-><字符串>
M[<參数>][for] =
M[<參数>][<] =
M[<參数>][>] =
M[<參数>][==] =
M[<參数>][!=] =
M[<參数>][++] =
M[<參数>][--] =
M[<參数>][if] =
M[<參数>][else] =
M[<參数>][return] =

M[<參数闭包>][(] =
M[<參数闭包>][)] = <參数闭包>->$
M[<參数闭包>][{] =
M[<參数闭包>][}] =
M[<參数闭包>][describe] =
M[<參数闭包>][type] =
M[<參数闭包>][*] =
M[<參数闭包>][id] =
M[<參数闭包>][[] =
M[<參数闭包>][]] =
M[<參数闭包>][digit] =
M[<參数闭包>][/] =
M[<參数闭包>][+] =
M[<參数闭包>][-] =
M[<參数闭包>][=] =
M[<參数闭包>][,] = <參数闭包>->,<參数><參数闭包>
M[<參数闭包>][;] =
M[<參数闭包>][string] =
M[<參数闭包>][for] =
M[<參数闭包>][<] =
M[<參数闭包>][>] =
M[<參数闭包>][==] =
M[<參数闭包>][!=] =
M[<參数闭包>][++] =
M[<參数闭包>][--] =
M[<參数闭包>][if] =
M[<參数闭包>][else] =
M[<參数闭包>][return] =

M[<字符串>][(] =
M[<字符串>][)] =
M[<字符串>][{] =
M[<字符串>][}] =
M[<字符串>][describe] =
M[<字符串>][type] =
M[<字符串>][*] =
M[<字符串>][id] =
M[<字符串>][[] =
M[<字符串>][]] =
M[<字符串>][digit] =
M[<字符串>][/] =
M[<字符串>][+] =
M[<字符串>][-] =
M[<字符串>][=] =
M[<字符串>][,] =
M[<字符串>][;] =
M[<字符串>][string] = <字符串>->string
M[<字符串>][for] =
M[<字符串>][<] =
M[<字符串>][>] =
M[<字符串>][==] =
M[<字符串>][!=] =
M[<字符串>][++] =
M[<字符串>][--] =
M[<字符串>][if] =
M[<字符串>][else] =
M[<字符串>][return] =

M[<逻辑表达式>][(] = <逻辑表达式>-><表达式><逻辑运算符><表达式>
M[<逻辑表达式>][)] =
M[<逻辑表达式>][{] =
M[<逻辑表达式>][}] =
M[<逻辑表达式>][describe] =
M[<逻辑表达式>][type] =
M[<逻辑表达式>][*] =
M[<逻辑表达式>][id] = <逻辑表达式>-><表达式><逻辑运算符><表达式>
M[<逻辑表达式>][[] =
M[<逻辑表达式>][]] =
M[<逻辑表达式>][digit] = <逻辑表达式>-><表达式><逻辑运算符><表达式>
M[<逻辑表达式>][/] =
M[<逻辑表达式>][+] =
M[<逻辑表达式>][-] =
M[<逻辑表达式>][=] =
M[<逻辑表达式>][,] =
M[<逻辑表达式>][;] =
M[<逻辑表达式>][string] =
M[<逻辑表达式>][for] =
M[<逻辑表达式>][<] =
M[<逻辑表达式>][>] =
M[<逻辑表达式>][==] =
M[<逻辑表达式>][!=] =
M[<逻辑表达式>][++] =
M[<逻辑表达式>][--] =
M[<逻辑表达式>][if] =
M[<逻辑表达式>][else] =
M[<逻辑表达式>][return] =

M[<后缀表达式>][(] =
M[<后缀表达式>][)] =
M[<后缀表达式>][{] =
M[<后缀表达式>][}] =
M[<后缀表达式>][describe] =
M[<后缀表达式>][type] =
M[<后缀表达式>][*] =
M[<后缀表达式>][id] = <后缀表达式>-><变量><后缀运算符>
M[<后缀表达式>][[] =
M[<后缀表达式>][]] =
M[<后缀表达式>][digit] =
M[<后缀表达式>][/] =
M[<后缀表达式>][+] =
M[<后缀表达式>][-] =
M[<后缀表达式>][=] =
M[<后缀表达式>][,] =
M[<后缀表达式>][;] =
M[<后缀表达式>][string] =
M[<后缀表达式>][for] =
M[<后缀表达式>][<] =
M[<后缀表达式>][>] =
M[<后缀表达式>][==] =
M[<后缀表达式>][!=] =
M[<后缀表达式>][++] =
M[<后缀表达式>][--] =
M[<后缀表达式>][if] =
M[<后缀表达式>][else] =
M[<后缀表达式>][return] =

M[<逻辑运算符>][(] =
M[<逻辑运算符>][)] =
M[<逻辑运算符>][{] =
M[<逻辑运算符>][}] =
M[<逻辑运算符>][describe] =
M[<逻辑运算符>][type] =
M[<逻辑运算符>][*] =
M[<逻辑运算符>][id] =
M[<逻辑运算符>][[] =
M[<逻辑运算符>][]] =
M[<逻辑运算符>][digit] =
M[<逻辑运算符>][/] =
M[<逻辑运算符>][+] =
M[<逻辑运算符>][-] =
M[<逻辑运算符>][=] =
M[<逻辑运算符>][,] =
M[<逻辑运算符>][;] =
M[<逻辑运算符>][string] =
M[<逻辑运算符>][for] =
M[<逻辑运算符>][<] = <逻辑运算符>-><
M[<逻辑运算符>][>] = <逻辑运算符>->>
M[<逻辑运算符>][==] = <逻辑运算符>->==
M[<逻辑运算符>][!=] = <逻辑运算符>->!=
M[<逻辑运算符>][++] =
M[<逻辑运算符>][--] =
M[<逻辑运算符>][if] =
M[<逻辑运算符>][else] =
M[<逻辑运算符>][return] =

M[<后缀运算符>][(] =
M[<后缀运算符>][)] =
M[<后缀运算符>][{] =
M[<后缀运算符>][}] =
M[<后缀运算符>][describe] =
M[<后缀运算符>][type] =
M[<后缀运算符>][*] =
M[<后缀运算符>][id] =
M[<后缀运算符>][[] =
M[<后缀运算符>][]] =
M[<后缀运算符>][digit] =
M[<后缀运算符>][/] =
M[<后缀运算符>][+] =
M[<后缀运算符>][-] =
M[<后缀运算符>][=] =
M[<后缀运算符>][,] =
M[<后缀运算符>][;] =
M[<后缀运算符>][string] =
M[<后缀运算符>][for] =
M[<后缀运算符>][<] =
M[<后缀运算符>][>] =
M[<后缀运算符>][==] =
M[<后缀运算符>][!=] =
M[<后缀运算符>][++] = <后缀运算符>->++
M[<后缀运算符>][--] = <后缀运算符>->--
M[<后缀运算符>][if] =
M[<后缀运算符>][else] =
M[<后缀运算符>][return] =

M[<否则语句>][(] =
M[<否则语句>][)] =
M[<否则语句>][{] =
M[<否则语句>][}] = <否则语句>->$
M[<否则语句>][describe] =
M[<否则语句>][type] =
M[<否则语句>][*] =
M[<否则语句>][id] = <否则语句>->$
M[<否则语句>][[] =
M[<否则语句>][]] =
M[<否则语句>][digit] =
M[<否则语句>][/] =
M[<否则语句>][+] =
M[<否则语句>][-] =
M[<否则语句>][=] =
M[<否则语句>][,] =
M[<否则语句>][;] =
M[<否则语句>][string] =
M[<否则语句>][for] = <否则语句>->$
M[<否则语句>][<] =
M[<否则语句>][>] =
M[<否则语句>][==] =
M[<否则语句>][!=] =
M[<否则语句>][++] =
M[<否则语句>][--] =
M[<否则语句>][if] = <否则语句>->$
M[<否则语句>][else] = <否则语句>->else{<函数块>}
M[<否则语句>][return] = <否则语句>->$


语法分析表:

preciateResult.txt:

第1步
符号栈:<函数定义> #
输入栈:type id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数定义>-><修饰词闭包><类型><变量>(<參数声明>){<函数块>}

第2步
符号栈:<修饰词闭包> <类型> <变量> ( <參数声明> ) { <函数块> } #
输入栈:type id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<修饰词闭包>->$

第3步
符号栈:<类型> <变量> ( <參数声明> ) { <函数块> } #
输入栈:type id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<类型>->type<取地址>

第4步
符号栈:type <取地址> <变量> ( <參数声明> ) { <函数块> } #
输入栈:type id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第5步
符号栈:<取地址> <变量> ( <參数声明> ) { <函数块> } #
输入栈:id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<取地址>-><星号闭包>

第6步
符号栈:<星号闭包> <变量> ( <參数声明> ) { <函数块> } #
输入栈:id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<星号闭包>->$

第7步
符号栈:<变量> ( <參数声明> ) { <函数块> } #
输入栈:id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第8步
符号栈:<标志符> <数组下标> ( <參数声明> ) { <函数块> } #
输入栈:id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第9步
符号栈:id <数组下标> ( <參数声明> ) { <函数块> } #
输入栈:id ( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第10步
符号栈:<数组下标> ( <參数声明> ) { <函数块> } #
输入栈:( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第11步
符号栈:( <參数声明> ) { <函数块> } #
输入栈:( ) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第12步
符号栈:<參数声明> ) { <函数块> } #
输入栈:) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<參数声明>->$

第13步
符号栈:) { <函数块> } #
输入栈:) { type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第14步
符号栈:{ <函数块> } #
输入栈:{ type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第15步
符号栈:<函数块> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块>-><声明语句闭包><函数块闭包>

第16步
符号栈:<声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>-><声明语句><声明语句闭包>

第17步
符号栈:<声明语句> <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句>-><声明>;

第18步
符号栈:<声明> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明>-><修饰词闭包><类型><变量><赋初值>

第19步
符号栈:<修饰词闭包> <类型> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<修饰词闭包>->$

第20步
符号栈:<类型> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<类型>->type<取地址>

第21步
符号栈:type <取地址> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第22步
符号栈:<取地址> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<取地址>-><星号闭包>

第23步
符号栈:<星号闭包> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<星号闭包>->$

第24步
符号栈:<变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第25步
符号栈:<标志符> <数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第26步
符号栈:id <数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第27步
符号栈:<数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第28步
符号栈:<赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋初值>->=<右值>

第29步
符号栈:= <右值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第30步
符号栈:<右值> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<右值>-><表达式>

第31步
符号栈:<表达式> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第32步
符号栈:<因子> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第33步
符号栈:<因式> <因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第34步
符号栈:<数字> <因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第35步
符号栈:digit <因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第36步
符号栈:<因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第37步
符号栈:<项> ; <声明语句闭包> <函数块闭包> } #
输入栈:; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第38步
符号栈:; <声明语句闭包> <函数块闭包> } #
输入栈:; type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第39步
符号栈:<声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>-><声明语句><声明语句闭包>

第40步
符号栈:<声明语句> <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句>-><声明>;

第41步
符号栈:<声明> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明>-><修饰词闭包><类型><变量><赋初值>

第42步
符号栈:<修饰词闭包> <类型> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<修饰词闭包>->$

第43步
符号栈:<类型> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<类型>->type<取地址>

第44步
符号栈:type <取地址> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第45步
符号栈:<取地址> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<取地址>-><星号闭包>

第46步
符号栈:<星号闭包> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<星号闭包>->$

第47步
符号栈:<变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第48步
符号栈:<标志符> <数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第49步
符号栈:id <数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id = digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第50步
符号栈:<数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第51步
符号栈:<赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋初值>->=<右值>

第52步
符号栈:= <右值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第53步
符号栈:<右值> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<右值>-><表达式>

第54步
符号栈:<表达式> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第55步
符号栈:<因子> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第56步
符号栈:<因式> <因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第57步
符号栈:<数字> <因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第58步
符号栈:digit <因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第59步
符号栈:<因式递归> <项> ; <声明语句闭包> <函数块闭包> } #
输入栈:; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第60步
符号栈:<项> ; <声明语句闭包> <函数块闭包> } #
输入栈:; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第61步
符号栈:; <声明语句闭包> <函数块闭包> } #
输入栈:; type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第62步
符号栈:<声明语句闭包> <函数块闭包> } #
输入栈:type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>-><声明语句><声明语句闭包>

第63步
符号栈:<声明语句> <声明语句闭包> <函数块闭包> } #
输入栈:type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句>-><声明>;

第64步
符号栈:<声明> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明>-><修饰词闭包><类型><变量><赋初值>

第65步
符号栈:<修饰词闭包> <类型> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<修饰词闭包>->$

第66步
符号栈:<类型> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<类型>->type<取地址>

第67步
符号栈:type <取地址> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:type id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第68步
符号栈:<取地址> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<取地址>-><星号闭包>

第69步
符号栈:<星号闭包> <变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<星号闭包>->$

第70步
符号栈:<变量> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第71步
符号栈:<标志符> <数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第72步
符号栈:id <数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:id [ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第73步
符号栈:<数组下标> <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:[ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->[<因式>]

第74步
符号栈:[ <因式> ] <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:[ digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第75步
符号栈:<因式> ] <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第76步
符号栈:<数字> ] <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第77步
符号栈:digit ] <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:digit ] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第78步
符号栈:] <赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:] = { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第79步
符号栈:<赋初值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋初值>->=<右值>

第80步
符号栈:= <右值> ; <声明语句闭包> <函数块闭包> } #
输入栈:= { digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第81步
符号栈:<右值> ; <声明语句闭包> <函数块闭包> } #
输入栈:{ digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<右值>->{<多个数据>}

第82步
符号栈:{ <多个数据> } ; <声明语句闭包> <函数块闭包> } #
输入栈:{ digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第83步
符号栈:<多个数据> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<多个数据>-><数字><数字闭包>

第84步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第85步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第86步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第87步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第88步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第89步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第90步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第91步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第92步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第93步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第94步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第95步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第96步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第97步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第98步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第99步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第100步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第101步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第102步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第103步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第104步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第105步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第106步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第107步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第108步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第109步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第110步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第111步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第112步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第113步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第114步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第115步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第116步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第117步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第118步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第119步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第120步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第121步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第122步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第123步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第124步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第125步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第126步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第127步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第128步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第129步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第130步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第131步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第132步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第133步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第134步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第135步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第136步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第137步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第138步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第139步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第140步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第141步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第142步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第143步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第144步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第145步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第146步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第147步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第148步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第149步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第150步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第151步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第152步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第153步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第154步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第155步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第156步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第157步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit , digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第158步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->,<数字><数字闭包>

第159步
符号栈:, <数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:, digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第160步
符号栈:<数字> <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第161步
符号栈:digit <数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:digit } ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第162步
符号栈:<数字闭包> } ; <声明语句闭包> <函数块闭包> } #
输入栈:} ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字闭包>->$

第163步
符号栈:} ; <声明语句闭包> <函数块闭包> } #
输入栈:} ; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第164步
符号栈:; <声明语句闭包> <函数块闭包> } #
输入栈:; for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第165步
符号栈:<声明语句闭包> <函数块闭包> } #
输入栈:for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>->$

第166步
符号栈:<函数块闭包> } #
输入栈:for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>-><for循环><函数块闭包>

第167步
符号栈:<for循环> <函数块闭包> } #
输入栈:for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<for循环>->for(<赋值函数><逻辑表达式>;<后缀表达式>){<函数块>}

第168步
符号栈:for ( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:for ( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第169步
符号栈:( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:( id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第170步
符号栈:<赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋值函数>-><变量><赋值或函数调用>

第171步
符号栈:<变量> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第172步
符号栈:<标志符> <数组下标> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第173步
符号栈:id <数组下标> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id = digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第174步
符号栈:<数组下标> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:= digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第175步
符号栈:<赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:= digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋值或函数调用>->=<右值>;

第176步
符号栈:= <右值> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:= digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第177步
符号栈:<右值> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<右值>-><表达式>

第178步
符号栈:<表达式> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第179步
符号栈:<因子> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第180步
符号栈:<因式> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第181步
符号栈:<数字> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第182步
符号栈:digit <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第183步
符号栈:<因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第184步
符号栈:<项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第185步
符号栈:; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:; id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第186步
符号栈:<逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<逻辑表达式>-><表达式><逻辑运算符><表达式>

第187步
符号栈:<表达式> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第188步
符号栈:<因子> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第189步
符号栈:<因式> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><变量>

第190步
符号栈:<变量> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第191步
符号栈:<标志符> <数组下标> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第192步
符号栈:id <数组下标> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id < digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第193步
符号栈:<数组下标> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:< digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第194步
符号栈:<因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:< digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第195步
符号栈:<项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:< digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第196步
符号栈:<逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:< digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<逻辑运算符>-><

第197步
符号栈:< <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:< digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第198步
符号栈:<表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第199步
符号栈:<因子> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第200步
符号栈:<因式> <因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第201步
符号栈:<数字> <因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第202步
符号栈:digit <因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:digit ; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第203步
符号栈:<因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第204步
符号栈:<项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第205步
符号栈:; <后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:; id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第206步
符号栈:<后缀表达式> ) { <函数块> } <函数块闭包> } #
输入栈:id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<后缀表达式>-><变量><后缀运算符>

第207步
符号栈:<变量> <后缀运算符> ) { <函数块> } <函数块闭包> } #
输入栈:id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第208步
符号栈:<标志符> <数组下标> <后缀运算符> ) { <函数块> } <函数块闭包> } #
输入栈:id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第209步
符号栈:id <数组下标> <后缀运算符> ) { <函数块> } <函数块闭包> } #
输入栈:id ++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第210步
符号栈:<数组下标> <后缀运算符> ) { <函数块> } <函数块闭包> } #
输入栈:++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第211步
符号栈:<后缀运算符> ) { <函数块> } <函数块闭包> } #
输入栈:++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<后缀运算符>->++

第212步
符号栈:++ ) { <函数块> } <函数块闭包> } #
输入栈:++ ) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第213步
符号栈:) { <函数块> } <函数块闭包> } #
输入栈:) { for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第214步
符号栈:{ <函数块> } <函数块闭包> } #
输入栈:{ for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第215步
符号栈:<函数块> } <函数块闭包> } #
输入栈:for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块>-><声明语句闭包><函数块闭包>

第216步
符号栈:<声明语句闭包> <函数块闭包> } <函数块闭包> } #
输入栈:for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>->$

第217步
符号栈:<函数块闭包> } <函数块闭包> } #
输入栈:for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>-><for循环><函数块闭包>

第218步
符号栈:<for循环> <函数块闭包> } <函数块闭包> } #
输入栈:for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<for循环>->for(<赋值函数><逻辑表达式>;<后缀表达式>){<函数块>}

第219步
符号栈:for ( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:for ( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第220步
符号栈:( <赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:( id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第221步
符号栈:<赋值函数> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋值函数>-><变量><赋值或函数调用>

第222步
符号栈:<变量> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第223步
符号栈:<标志符> <数组下标> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第224步
符号栈:id <数组下标> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id = id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第225步
符号栈:<数组下标> <赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:= id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第226步
符号栈:<赋值或函数调用> <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:= id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋值或函数调用>->=<右值>;

第227步
符号栈:= <右值> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:= id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第228步
符号栈:<右值> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<右值>-><表达式>

第229步
符号栈:<表达式> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第230步
符号栈:<因子> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第231步
符号栈:<因式> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><变量>

第232步
符号栈:<变量> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第233步
符号栈:<标志符> <数组下标> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第234步
符号栈:id <数组下标> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id + digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第235步
符号栈:<数组下标> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:+ digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第236步
符号栈:<因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:+ digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第237步
符号栈:<项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:+ digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->+<因子><项>

第238步
符号栈:+ <因子> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:+ digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第239步
符号栈:<因子> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第240步
符号栈:<因式> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第241步
符号栈:<数字> <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第242步
符号栈:digit <因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第243步
符号栈:<因式递归> <项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第244步
符号栈:<项> ; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第245步
符号栈:; <逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:; id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第246步
符号栈:<逻辑表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<逻辑表达式>-><表达式><逻辑运算符><表达式>

第247步
符号栈:<表达式> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第248步
符号栈:<因子> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第249步
符号栈:<因式> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><变量>

第250步
符号栈:<变量> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第251步
符号栈:<标志符> <数组下标> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第252步
符号栈:id <数组下标> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id < digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第253步
符号栈:<数组下标> <因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:< digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第254步
符号栈:<因式递归> <项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:< digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第255步
符号栈:<项> <逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:< digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第256步
符号栈:<逻辑运算符> <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:< digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<逻辑运算符>-><

第257步
符号栈:< <表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:< digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第258步
符号栈:<表达式> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第259步
符号栈:<因子> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第260步
符号栈:<因式> <因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第261步
符号栈:<数字> <因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第262步
符号栈:digit <因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第263步
符号栈:<因式递归> <项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第264步
符号栈:<项> ; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第265步
符号栈:; <后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:; id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第266步
符号栈:<后缀表达式> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<后缀表达式>-><变量><后缀运算符>

第267步
符号栈:<变量> <后缀运算符> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第268步
符号栈:<标志符> <数组下标> <后缀运算符> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第269步
符号栈:id <数组下标> <后缀运算符> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:id -- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第270步
符号栈:<数组下标> <后缀运算符> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:-- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第271步
符号栈:<后缀运算符> ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:-- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<后缀运算符>->--

第272步
符号栈:-- ) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:-- ) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第273步
符号栈:) { <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:) { if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第274步
符号栈:{ <函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:{ if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第275步
符号栈:<函数块> } <函数块闭包> } <函数块闭包> } #
输入栈:if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块>-><声明语句闭包><函数块闭包>

第276步
符号栈:<声明语句闭包> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>->$

第277步
符号栈:<函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>-><条件语句><函数块闭包>

第278步
符号栈:<条件语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<条件语句>->if(<逻辑表达式>){<函数块>}<否则语句>

第279步
符号栈:if ( <逻辑表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:if ( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第280步
符号栈:( <逻辑表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:( id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第281步
符号栈:<逻辑表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<逻辑表达式>-><表达式><逻辑运算符><表达式>

第282步
符号栈:<表达式> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第283步
符号栈:<因子> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第284步
符号栈:<因式> <因式递归> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><变量>

第285步
符号栈:<变量> <因式递归> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第286步
符号栈:<标志符> <数组下标> <因式递归> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第287步
符号栈:id <数组下标> <因式递归> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id == digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第288步
符号栈:<数组下标> <因式递归> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:== digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第289步
符号栈:<因式递归> <项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:== digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第290步
符号栈:<项> <逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:== digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第291步
符号栈:<逻辑运算符> <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:== digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<逻辑运算符>->==

第292步
符号栈:== <表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:== digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第293步
符号栈:<表达式> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第294步
符号栈:<因子> <项> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第295步
符号栈:<因式> <因式递归> <项> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><数字>

第296步
符号栈:<数字> <因式递归> <项> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数字>->digit

第297步
符号栈:digit <因式递归> <项> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:digit ) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第298步
符号栈:<因式递归> <项> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第299步
符号栈:<项> ) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第300步
符号栈:) { <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:) { id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第301步
符号栈:{ <函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:{ id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第302步
符号栈:<函数块> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块>-><声明语句闭包><函数块闭包>

第303步
符号栈:<声明语句闭包> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<声明语句闭包>->$

第304步
符号栈:<函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>-><赋值函数><函数块闭包>

第305步
符号栈:<赋值函数> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋值函数>-><变量><赋值或函数调用>

第306步
符号栈:<变量> <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第307步
符号栈:<标志符> <数组下标> <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第308步
符号栈:id <数组下标> <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id [ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第309步
符号栈:<数组下标> <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:[ id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->[<因式>]

第310步
符号栈:[ <因式> ] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:[ id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第311步
符号栈:<因式> ] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><变量>

第312步
符号栈:<变量> ] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第313步
符号栈:<标志符> <数组下标> ] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第314步
符号栈:id <数组下标> ] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第315步
符号栈:<数组下标> ] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:] = id ; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第316步
符号栈:] <赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:] = id ; } } } id ( string ) ; return digit ; } #
匹配!
第317步
符号栈:<赋值或函数调用> <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:= id ; } } } id ( string ) ; return digit ; } #
所用推出式:<赋值或函数调用>->=<右值>;

第318步
符号栈:= <右值> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:= id ; } } } id ( string ) ; return digit ; } #
匹配!
第319步
符号栈:<右值> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
所用推出式:<右值>-><表达式>

第320步
符号栈:<表达式> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
所用推出式:<表达式>-><因子><项>

第321步
符号栈:<因子> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因子>-><因式><因式递归>

第322步
符号栈:<因式> <因式递归> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
所用推出式:<因式>-><变量>

第323步
符号栈:<变量> <因式递归> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第324步
符号栈:<标志符> <数组下标> <因式递归> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第325步
符号栈:id <数组下标> <因式递归> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:id ; } } } id ( string ) ; return digit ; } #
匹配!
第326步
符号栈:<数组下标> <因式递归> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:; } } } id ( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第327步
符号栈:<因式递归> <项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:; } } } id ( string ) ; return digit ; } #
所用推出式:<因式递归>->$

第328步
符号栈:<项> ; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:; } } } id ( string ) ; return digit ; } #
所用推出式:<项>->$

第329步
符号栈:; <函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:; } } } id ( string ) ; return digit ; } #
匹配!
第330步
符号栈:<函数块闭包> } <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:} } } id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>->$

第331步
符号栈:} <否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:} } } id ( string ) ; return digit ; } #
匹配!
第332步
符号栈:<否则语句> <函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:} } id ( string ) ; return digit ; } #
所用推出式:<否则语句>->$

第333步
符号栈:<函数块闭包> } <函数块闭包> } <函数块闭包> } #
输入栈:} } id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>->$

第334步
符号栈:} <函数块闭包> } <函数块闭包> } #
输入栈:} } id ( string ) ; return digit ; } #
匹配!
第335步
符号栈:<函数块闭包> } <函数块闭包> } #
输入栈:} id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>->$

第336步
符号栈:} <函数块闭包> } #
输入栈:} id ( string ) ; return digit ; } #
匹配!
第337步
符号栈:<函数块闭包> } #
输入栈:id ( string ) ; return digit ; } #
所用推出式:<函数块闭包>-><赋值函数><函数块闭包>

第338步
符号栈:<赋值函数> <函数块闭包> } #
输入栈:id ( string ) ; return digit ; } #
所用推出式:<赋值函数>-><变量><赋值或函数调用>

第339步
符号栈:<变量> <赋值或函数调用> <函数块闭包> } #
输入栈:id ( string ) ; return digit ; } #
所用推出式:<变量>-><标志符><数组下标>

第340步
符号栈:<标志符> <数组下标> <赋值或函数调用> <函数块闭包> } #
输入栈:id ( string ) ; return digit ; } #
所用推出式:<标志符>->id

第341步
符号栈:id <数组下标> <赋值或函数调用> <函数块闭包> } #
输入栈:id ( string ) ; return digit ; } #
匹配!
第342步
符号栈:<数组下标> <赋值或函数调用> <函数块闭包> } #
输入栈:( string ) ; return digit ; } #
所用推出式:<数组下标>->$

第343步
符号栈:<赋值或函数调用> <函数块闭包> } #
输入栈:( string ) ; return digit ; } #
所用推出式:<赋值或函数调用>->(<參数列表>);

第344步
符号栈:( <參数列表> ) ; <函数块闭包> } #
输入栈:( string ) ; return digit ; } #
匹配!
第345步
符号栈:<參数列表> ) ; <函数块闭包> } #
输入栈:string ) ; return digit ; } #
所用推出式:<參数列表>-><參数><參数闭包>

第346步
符号栈:<參数> <參数闭包> ) ; <函数块闭包> } #
输入栈:string ) ; return digit ; } #
所用推出式:<參数>-><字符串>

第347步
符号栈:<字符串> <參数闭包> ) ; <函数块闭包> } #
输入栈:string ) ; return digit ; } #
所用推出式:<字符串>->string

第348步
符号栈:string <參数闭包> ) ; <函数块闭包> } #
输入栈:string ) ; return digit ; } #
匹配!
第349步
符号栈:<參数闭包> ) ; <函数块闭包> } #
输入栈:) ; return digit ; } #
所用推出式:<參数闭包>->$

第350步
符号栈:) ; <函数块闭包> } #
输入栈:) ; return digit ; } #
匹配!
第351步
符号栈:; <函数块闭包> } #
输入栈:; return digit ; } #
匹配!
第352步
符号栈:<函数块闭包> } #
输入栈:return digit ; } #
所用推出式:<函数块闭包>-><函数返回><函数块闭包>

第353步
符号栈:<函数返回> <函数块闭包> } #
输入栈:return digit ; } #
所用推出式:<函数返回>->return<因式>;

第354步
符号栈:return <因式> ; <函数块闭包> } #
输入栈:return digit ; } #
匹配!
第355步
符号栈:<因式> ; <函数块闭包> } #
输入栈:digit ; } #
所用推出式:<因式>-><数字>

第356步
符号栈:<数字> ; <函数块闭包> } #
输入栈:digit ; } #
所用推出式:<数字>->digit

第357步
符号栈:digit ; <函数块闭包> } #
输入栈:digit ; } #
匹配!
第358步
符号栈:; <函数块关闭> } #
进入堆栈:; } #
比赛!
文章359步骤
符号栈:<功能块关闭> } #
进入堆栈:} #
该推挽使用:<功能块关闭>->$

文章360步骤
符号栈:} #
进入堆栈:} #
比赛!
文章361步骤
符号栈:#
进入堆栈:#
成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: