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

该方案实现了一个分析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][n];
                        if(proc[i+1][n] == -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步骤
符号栈:#
进入堆栈:#
成功!
时间: 2024-10-05 05:05:00

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

(2)自己写一个简单的servle容器

自己写一个简单的servlet,能够跑一个简单的servlet,说明一下逻辑. 首先是写一个简单的servlet,这就关联到javax.servlet和javax.servlet.http这两个包的类,其中一个比较重要的接口就是:javax.servlet.Servlet,所有的servlet必须实现实现或者继承实现该接口的类. Servlet接口有五个方法: public void init(ServletConfig config) throws ServletException publi

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

一个简单的HTML病毒分析

一直就想写这篇东西了,只是上班时说要上班,不写,回家后又忙着玩游戏,丢一边去了.现在只好不务正业的开写了,希望头儿不会知道我的blog.哈哈 在很久之前就对HTML的病毒很感兴趣了,很好奇怎么能远程向本地不经过允许就能下载可执行文件的,只是一直没机会搞得到ASP的原码,所以不才敢断章取义的去作什么分析.最近一次听一朋友说他看一个网页时病毒防火墙提示有病毒,叫我小心(先感谢一下他先),我闪了一下念头,就打开FlashGet把那个病毒首页下了下来. 稍微看了一下发现在首页代码的下面几行里有一个隐含的

不用任何第三方,写一个RTMP直播推流器

2016年是移动直播爆发年,不到半年的时间内无数移动直播App掀起了全民直播的热潮.然而个人觉得直播的门槛相对较高,从推流端到服务端器到播放端,无不需要专业的技术来支撑,仅仅推流端就有不少需要学习的知识.目前大部分直播采用的都是RTMP协议,我这里写一个简单的Demo,帮助大家更好的理解直播推流的过程,主要包括:音视频采集, 音视频编码, 数据打包, RTMP协议等相关的知识等.项目结构分的很清楚,各个模块也用协议进行了分离,方便大家学习不同的模块. 先阐述下推流的整体流程: 建立tcp连接 建

可视化程序设计基础(三)——一个简单的播放器(并不)

本次的作业是制作一个简单的播放器,功能仅限于播放视频和音频,虽说是简单的播放器,但其中还是有很多细节需要注意的. 问题一:布局 本来这个问题不应该是一个问题了,之前老师讲过的Stackpanel和Grid等对于布局一个播放器来说绰绰有余,但上次上课老师提到的NavigationView令我十分感兴趣,这是一个uwp应用程序中随处可见的一种布局,节省了开发者很多的时间. 所以我就着手于建立这个NavigationView了,首先我看了一下XAML Controls Gallery,然而其中关于Na

用CSS写一个简单的幻灯片效果页面

这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [用CSS写一个简单的幻灯片效果页面] 1.背景介绍CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation. transform属性向元素应用2D或3D转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. transition是令一个或多个可以用数值表示的css属性值

写一个简单的模板引擎

写一个简单的模板引擎 ES6 开始支持模板字符串(Template literals),支持如下的写法: `string text ${expression} string text`; 其实在很多模板引擎中,常常会有这样需求,比如常用的 doT,使用类似的语法 <div>{{=1+2}}</div> // 或者支持循环或者判断 {{for(var i in it){}}} <span>{{=i}}</span> {{}}} 简单插值的实现 我们先来看看一个

利用SpringBoot+Logback手写一个简单的链路追踪

目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简单的链路追踪,下面详细介绍下. 一.实现原理 Spring Boot默认使用LogBack日志系统,并且已经引入了相关的jar包,所以我们无需任何配置便可以使用LogBack打印日志. MDC(Mapped Diagnostic Context,映射调试上下文)是log4j和logback提供的一种

用C写一个简单的推箱子游戏(一)

我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱子小程序. 这一程序主要用到了C语言中的二维数组,头文件#include<conio.h>(因为要调用getch()函数以记录输入内容),switch函数等. 一.     功能概述 a)   游戏规则概述 玩家通过键盘输入W.S.A.D四键或者“↑”.“↓”.“←”.“→”四个方向键推动箱子,而