语法分析——简单判断条件语句,赋值语句,循环语句

编译原理实验六:对多条执行语句的递归下降分析 【任务介绍】根据给定的上下文无关文法,对高级程序设计语言中常见的几种执行语句进行语法分析。 【输入】一串执行语句,其中包括:赋值语句、选择语句和循环语句。 【输出】与输入对应的一颗完整的语法树或者错误。 【题目】设计一个程序,根据给定的上下文无关文法,对于输入的一串源程序语句,构造其对应的语法树或者报告错误。要求: 1.基础文法以为开始符号: <Block> → { <Decls> <STMTS> } <Decls> → <Decls> < 阅读详情

语法分析小程序。简单判断赋值、条件、循环,代码块开始,结束

二、     实验要求

1.待分析的简单语言的语法

用扩充的EBNF表示如下:

<程序块>::= begin<语句>{;<语句>} end.

<语句>::= <赋值语句>|<条件语句>|<循环语句>

<赋值语句>::= IDENT:=<表达式>

<条件语句>::= if <条件>then <语句>

<循环语句>::= while <条件> do <语句>

<表达式>::= [+|-]<项>{(+|-)<项>}

<项>::= <因子>{(*|/)<因子>}

<因子>::= IDENT | NUMBER |‘(’<表达式>‘)’

<条件>::= <表达式><关系运算符><表达式>

<关系运算符>::= <>|=|<|<=|>|>=

 

2. 实验要求说明

输入单词串,以“.”结束,如果是文法正确的句子,则输出成功信息,否则输出失败信息,指出错误原因。需要系统地规划错误码。 例如:

输入  begina:=2*3 end.

输出  syntaxparses success!

输入  beginx=4 end.

输出  Error 11: 没有检测到赋值语句的:=符号

输入 beginx:=2;while x>0 do if x/2=0 then x:=(x/2) end.

输出  syntaxparses success!

 

3. 语法分析设计说明

采用递归下降分析程序。为每个非终结符编写一个子过程。


设计思路

1.变量说明

line    从终端读入的字符串;    

p       当前所指位置在计数器,

ch      字符为

token   正在识别的单词字符串;

m       当前所指位置在计数器

  num     整型常数

sym     每个单词符号种类

word    保留字表

Err     错误类型标记

flag    出错标记

 

 2.函数说明

    void getsym();              //判断输入字符类型

int block();                //程序快分析函数

void error(int i);          //出错处理函数

void statement();           //语句处理函数

void expression();          //表达式处理函数

void term();                //项处理函数

void factor();              //因子处理函数

void condition();           //条件处理函数

void Relational_operator(); //表达式处理函数

void printSym(int i)        //打印输入字符的类型

接下来举例说明几个重要函数

1).getsym()函数示意图


2).main()函数示意图


3)block()函数示意图


3).error()函数示意图

错误序号

出错原因

1

没有检测到语句期望begin符号

2

没有检测到赋值语句的 := 符号

3

没有检测到条件语句的 then 符号

4

没有检测到循环语句的 do 符号

5

错误的句子!

6

你写了数字!

7

没有检测到 '(' 的 ')' 符号

8

没有检测到因子

9

没有检测到关系运算符

11

没有检测到语句期望 end 符号


4). statement ()函数示意图


二、     实验截图

 

输入  begin a:=2*3 end.

输出  syntax parses success!

 

输入  begin x=4 end.

输出  Error 11: 没有检测到赋值语句的:=符号


输入 begin x:=2;while x>0 do if x/2=0 then x:=(x/2) end.

输出  syntax parses success!

 

   实验总结

1.这个结合上次作业增加了对注释部分的语句处理

 

2.为解决出错就直接函数返回增加了flag布尔型变量,处理出错的及时报错,函数返回

 

3.在出错处理上参考了现在主流的编译器gcc,g++,发现他们是遇到出错的点直接报错,递归不返回。

例如:begin x=4end.

这句话,缺少:=符号,但是编译器只报赋值符号缺少,不会返回报错赋值语句出错,语句出错,程序块出错这种错误。

但是如果有这个需求,只需要把flag一个一个递归返回传值就好


代码:

#include <bits/stdc++.h>
using namespace std;

/*
变量说明:
 line	从终端读入的字符串;		当前所指位置在计数器 p
 token	为存放的单词自身字符串;当前所指位置在计数器 m
 number	整型常数
 sym	每个单词符号种类

*/

enum symbol
{
    period=0,
    ident=1,
    number=2,
    Plus=3,
    Minus=4,
    times=5,
    slash=6,
    eql=7,
    neq=8,
    lss=9,
    leq=10,
    gtr=11,
    geq=12,
    lparen=13,
    rparen=14,
    semicolon=15,
    becomes=16,
    beginsym=17,
    endsym=18,
    ifsym=19,
    thensym=20,
    whilesym=21,
    dosym=22,
    note=23,
    nil=24,
};

char line[100],token[10],ch;
char s2[10];
enum symbol sym;
int p,m, num;
char *word[6]= {"begin","end", "if","then","while","do"};
int Err;
bool flag=true;
bool flag2=false;
bool flag3=false;

void getsym();
int block();
void error(int i);
void statement();
void expression();
void term();
void factor();
void condition();
void Relational_operator();

int main()
{
	freopen("t1.txt","r",stdin);
    //读了字符串, 直到遇.结束
    p=0;
    printf("\n please input a string(end with '.'): ");
    do
    {
        scanf("%c",&ch);
        line[p++]=ch;
    }
    while(ch!='.');
    line[p++]='\0';

    //逐个单词扫描;
    Err = 0;
    p=0;
    getsym();				//当前扫描的单词存放在sym中
    block();
    if ((sym==0)&&(Err==0))
        printf("syntax parses success!\n");
    return 0;
}

void printSym(enum symbol sym)
{

	/************************************************
  ****										                    ****
	****         TODO: 输出单词                  ****
	****                                        ****
	*************************************************/
	switch(sym)
	{
	case period:
		return;
	case number:
		printf("%d ",num);
		break;
	case nil:
		printf("you have input a wrong string\n");
		break;
	case note:
		//printf("this is notes\n");
		break;
	case Plus:
		printf("+");
		break;
	case Minus:
		printf("-");
		break;
	case times:
		printf("*");
		break;
	case slash:
		printf("/");
		break;
	case eql:
		printf("=");
		break;
	case neq:
		printf("><");
		break;
	case lss:
		printf("<");
		break;
	case leq:
		printf("<=");
		break;
	case gtr:
		printf(">");
		break;
	case geq:
		printf(">=");
		break;
	case lparen:
		printf("( ");
		break;
	case rparen:
		printf(") ");
		break;
	case semicolon:
		printf("; ");
		break;
	case becomes:
		printf(":= ");
		break;
	case beginsym:
		printf("\nbegin ");
		break;
	case endsym:
		flag3=true;
		printf("print( %s ) ",s2);
		printf("end\n");
		break;
	case ifsym:
		printf("if ");
		break;
	case thensym:
		printf("then ");
		break;
	case whilesym:
		printf("while ");
		break;
	case dosym:
		printf("do ");
		break;
	case ident:
		printf("%s ",token);
		break;
	default:
		break;
	}
}


void getsym()
{

	for(m=0; m<8;m++) token[m++]=NULL;
	ch=line[p++];
	m=0;
	/************************************************
  ****									                     	****
	****         TODO: 单词识别                 ****
	****                                        ****
	*************************************************/
	while((ch==' '||ch=='\n')) ch=line[p++];
	//字母打头的字符串;标识符
	if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))
	{
		do
		{
			token[m++]=ch;
			ch=line[p++];
		}while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'));
		sym=ident;
		token[m++]='\0';
		ch=line[p--];
		for(int n=0;n<6;n++)
		{
			if(strcmp(token,word[n])==0)
			{
				if(n==0) sym=beginsym;
				else if(n==1) sym=endsym;
				else if(n==2) sym=ifsym;
				else if(n==3) sym=thensym;
				else if(n==4) sym=whilesym;
				else if(n==5) sym=dosym;
				break;
			}
		}

		/*TODO识别标识符IDENT和保留字*/

	}
	else if((ch<='9'&&ch>='0'))
	{
		num=0;
		do{
			num=num*10+ch-'0';
			ch=line[p++];
		}while((ch<='9'&&ch>='0'));
		ch=line[p--];
		sym=number;
		/*TODO识别数字NUMBER*/
	}
	else {
		switch(ch)
		{
		case ':':		//赋值符号
			token[m++]=ch;
			ch=line[p++];
			if(ch=='=')
			{
				sym=becomes;
				token[m++]=ch;
			}
			else{
				sym=nil;
			}
			break;
		case '<':		//<=和<符号
			token[m++]=ch;
			ch=line[p++];
			if(ch=='=')
			{
				token[m++]=ch;
				sym=leq;
			}
			else if(ch=='>'){
				token[m++]=ch;
				sym=neq;
			}
			else{
				sym=lss;
				p--;
			}
			break;
		case '>':		//>=和>符号
			token[m++]=ch;
			ch=line[p++];
			if(ch=='=')
			{
				sym=geq;
				token[m++]=ch;
			}
			else{
				sym=gtr;
				p--;
			}
			break;
		case '+':
			sym=Plus;
			token[m++]=ch;
			break;
		case '-':
			sym=Minus;
			token[m++]=ch;
			break;
		case '*':
			sym=times;
			token[m++]=ch;
			break;
		case '/':
			ch=line[p++];
			if(ch=='*'){
				//cout<<"in\n";
				char fr;//前面的一个符号
				fr='*';
				ch=line[p++];
				while(1){
					fr=ch;
					ch=line[p++];
					if(fr=='*'&&ch=='/') break;
				}
				sym=note;
				token[m++]=ch;
			}
			else
			{
				sym=slash;
				token[m++]=ch;
				p--;
			}
			break;
		case '=':
			sym=eql;
			token[m++]==ch;
			break;
		case '(':
			sym=lparen;
			token[m++]=ch;
			break;
		case ')':
			sym=rparen;
			token[m++]=ch;
			break;
		case ';':
			sym=semicolon;
			token[m++]=ch;
			break;
		case '.':
			sym=period;
			token[m++]=ch;
			break;
		case ' ':
			token[m++]=ch;
			break;
		default:
			sym=nil;
			break;
		}
	}
	token[m++]='\0';
	//如果想看分析的每一个sym,请打开这个注释
    printSym(sym);
    //处理语句分析中的注释
    if(sym==note) getsym();
}

void error(int i)
{
    switch (i)
    {
    case 1:
        printf("Error %d: 没有检测到语句期望begin符号\n", i);
        break;
	case 2:
		printf("Error %d: 没有检测到赋值语句的 := 符号\n",i);
		break;
	case 3:
		printf("Error %d: 没有检测到条件语句的 then 符号\n",i);
		break;
	case 4:
		printf("Error %d: 没有检测到循环语句的 do 符号\n",i);
		break;
	case 5:
		printf("Error %d: 错误的句子!\n",i);
		break;
	case 6:
		printf("Error %d: 你写了数字!\n",i);
		break;
	case 7:
		printf("Error %d: 没有检测到 '(' 的 ')' 符号\n",i);
		break;
	case 8:
		printf("Error %d: 没有检测到因子\n",i);
		break;
	case 9:
		printf("Error %d: 没有检测到关系运算符\n",i);
		break;
    case 11:
        printf("Error %d: 没有检测到语句期望 end 符号\n", i);
        break;
    default:
        break;
    }
    flag=false;
    Err++;
}

int block()
{
    //cout<<"程序块分析\n";
    if (sym != beginsym)
    {
        error(1);
    }
    else
    {
        getsym();
        statement();		//语句处理
        while (sym == semicolon)
        {
            getsym();
            statement();		//语句处理
        }
        if (sym != endsym&&flag)
        {
            error(11);
        }
        getsym();
    }
	return 0;


}

void statement()
{
    /********************************************
     **** TODO: 语句处理(赋值/条件/循环) *****
     *******************************************/
     flag2=false;
	//cout<<"语句处理\n";
    if(sym==ident)
    {
		flag2=true;
		flag3=false;
		for(int i=0;i<strlen(token)+1;i++)
			s2[i]=token[i];
        //赋值语句
        //cout<<"赋值语句分析\n";
        getsym();
        if(sym==becomes)
        {
            getsym();
            expression();
			if(!flag3) printf(" print( %s ); ",s2);
        }
        else
        {
        	error(2);
            //printf("Error!赋值语句左部标识符后面应是赋值号 ':='\n");
            return;
        }
    }
    else if(sym==ifsym)
    {
        //条件语句
        //cout<<"条件语句分析\n";
        getsym();
        condition();
        if(sym==thensym)
        {
        	getsym();
            statement();
        }
        else
        {
        	error(3);
            //printf("Error!条件语句条件后面应是 'then'\n");
            return;
        }
    }
    else if(sym==whilesym)
    {
        //循环语句
        //cout<<"循环语句分析\n";
        getsym();
        condition();
        if(sym==dosym)
        {
        	getsym();
            statement();
        }
        else
        {
        	error(4);
            //printf("Error!循环语句条件后面应是 'do'\n");
            return;
        }
    }
    else
    {
    	error(5);
        //printf("错误的句子!\n");
        return;
    }
    if(sym==number)
    {
    	error(6);
        //printf("你写了数字!\n");
        return;
    }
}

void expression()
{
	//cout<<"表达式处理\n";
    /********************************************
     *************** TODO: 表达式处理 *************
     *******************************************/
    if(sym==Plus||sym==Minus)
    {
        getsym();
        term();
    }
    else
    {
        term();
        while(sym==Plus||sym==Minus)
        {
            getsym();
            term();
        }
    }
}

void term()
{
	//cout<<"项处理\n";
    /********************************************
     *************** TODO: 项处理 *************
     *******************************************/
    if(sym==times||sym==slash)
    {
        getsym();
        factor();
    }
    else
    {
        factor();
        while(sym==times||sym==slash)
        {
            getsym();
            factor();
        }
    }
}

void factor()
{
	//cout<<"因子处理\n";
    /********************************************
     *************** TODO: 因子处理 *************
     *******************************************/
    if(sym==ident||sym==number)
    {
        getsym();
    }
    else if(sym==lparen)
    {
        getsym();
        expression();
        if(sym==rparen) getsym();
        else
        {
        	error(7);
            //printf("语法分析出错!请检查是否缺少 ')'\n");
            return;
        }
    }
    else
    {
    	error(8);
        //printf("Error!缺少因子\n");
        return;
    }
}

void condition()
{
	//cout<<"条件处理\n";
    /********************************************
     *************** TODO: 条件处理 *************
     *******************************************/
    expression();
    //getsym();
    Relational_operator();
    getsym();
    expression();
}


void Relational_operator()
{
	//cout<<"关系运算符处理\n";
    /********************************************
     *************** TODO: 关系运算符 *************
     *******************************************/
    if(sym==neq||sym==eql||sym==lss||sym==leq||sym==gtr||sym==geq||sym==8||sym==9||sym==10||sym==11||sym==12||sym==13)
	{
		//getsym();
	}
    else
    {
    	error(9);
        //printf("Error!缺少关系运算符\n");
        return;
    }
}




用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(3)- 词法分析 用c语言手搓一个... 阅读详情

相关推荐

编译原理(词法分析 语法分析源代码+报告)

一、实验目的 编制一个递归下降分析程序,实现对词法分析程序提供的单词序列的语法检查和结构分析。 二、实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 1、 用扩充的BNF表示如下 (1)::beginend (2)::{;} (3):: (4)::ID:= (5)::={+|-} (6)::{*|/} (7)::ID|NUM() 2、实验要求说明 输入单词串,以”#”结束,如果是文法正确的句子,则输出成功的信息,打印”success”,否则输出”error”。 例如: 输入 begin a:=9;x:=2*3;b:=a+x end 输出 success 输入 x:=a+b*c end # 输出 error

【编译原理】词法分析器&语法分析器

采用Java语言对C++语言进行编译,具体的简单编译器设计 语法分析器的设计与实现 文法产生式 S‘:程序(语句的组合)S:语句 Q:else语句 L:标识符表 E:表达式X:条件表达式 R:比较运算符 id:标识符 num:常量 提取公共左因子 消除左递归 求FIRST集 求FOLLOW集 LL(1)预测分析表中的数字分别代表的产生式如下: 预测分析表...

Joise_的博客 2908

大模型系统构建的“三驾马车”——Prompt、Context与Harness工程

在LLM应用开发的早期阶段,我们热衷于比拼“提示词”的精妙程度。那时,一个精心构造的思维链CoT就能让模型的表现提升10%以上。随着大模型从“玩具”走向“生产系统”,我们逐渐意识到:单一的 Prompt 只是起点,而非终点。 真正的工业级应用,需要构建一套三层递进的工程体系——Prompt Engineering、Context Engineering 和 Harness Engineering。

西木风落 604

【编译原理】实验二 语法分析器设计与实现

实验类型: 设计性 实验学时:4 实验要求:必修 一、实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。 二、实验内容 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 2.1 待分析的简单语言的语法 用扩充的范式表示如下: 2.2 实验要求说明 输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打...

HPU_LY的博客 1万+

思科9117AP从零配置EWC模式实战:Wi-Fi6网络搭建避坑指南

本文详细介绍了思科9117AP在Wi-Fi6网络环境下配置EWC模式的实战指南,涵盖镜像准备、网络环境配置、模式转换步骤及高级运维技巧。通过EWC模式,企业可实现控制器与AP的一体化部署,显著降低成本和简化运维,特别适合中小企业Wi-Fi6网络搭建。

weixin_28318011的博客 332

TC397 EB MCAL开发从0开始系列 之 [17.1] ETH配置实战 - ping/发送

TC397 MCAL 从0开始之 ETH ping测试

yy九歌的博客 1505

赋值语句与条件语句

一、阻塞赋值 阻塞赋值与C语言中赋值方法和分析方法一模一样。 二、非阻塞赋值 非阻塞赋值可看作两个过程: (1)赋值开始时,计算等号右边(RHS)的值; (2)赋值结束时,更新等号左边(LHS)的值。 这体现了Verilog语言并行化的特点。 非阻塞赋值只能对寄存器类型变量赋值,因此只能用于initial和always块中。 三、条件语句 if语句对表达式的值做判断时,若为0、x或z则按假处理;若为1则为真。 case语句位宽必须相等,‘bx表示32位; casez表示比较时不考虑高阻值; casex表示不

qq_45382733的博客 904

【电源专题】LDO基础——热性能2

对于LDO散热而言,选择合适的元件并不是一件简单的任务。为了实现高效、尺寸得当并成本低的散热解决方案,我们在早期设计阶段就需要确保所有器件都可用并且已经考虑到元件和各种特性。

一点硬件 894

PL/0编译程序的简单实现

PL-0编译器代码参考

Soledad-X's Blog 5597

55、宇宙微波背景辐射望远镜及其光学系统解析

本文详细解析了宇宙微波背景辐射(CMB)望远镜及其光学系统的设计与优化。内容涵盖折射与反射光学系统的特性、旁瓣控制技术、气球与地面观测系统的对比、探测器阵列的发展、光学系统设计流程以及不同观测场景下的光学系统选择。同时,文章展望了CMB望远镜光学系统的未来发展趋势,包括技术创新、多频段观测、国际合作与大型项目等。通过系统性的分析与对比,为CMB研究提供了全面的技术支持与理论基础。

f9g0h的博客 142

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

865

扩充PL/0语言语法的EBNF描述

<程序> :: = <分程序>. <分程序> :: = [<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句> <常量说明部分> :: = CONST <常量定义>{ ,<常量定义> }; <常量定义> :: = <id>= <integer> <变量说明部分> :: = VAR <id>{ ,<id&g...

caixiaobaideye的博客 2719

在 SAP Fiori 里玩转 Manage Views:把过滤器与列表布局固化成你的默认工作台

本文介绍了SAP Fiori应用中"Manage Views"功能的核心价值和使用方法。该功能允许用户保存和复用个性化界面设置,包括筛选条件、列布局等,将重复操作简化为一次性配置。文章从技术实现、用户操作和治理建议三个维度展开: 功能本质:View存储的是界面状态而非业务模型,是提升个人生产力的工具 核心价值:固化高频操作,支持默认视图设置,实现"开箱即用"的工作状态 操作指南:详细说明了收藏、重命名、设为默认、自动应用等关键功能 治理建议:区分标准视图、个人视图和公

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 125

java里赋值语句_java输入赋值语句

掌握条件语句的使用 2、熟悉循环语句的使用 二、实验环境: 有 Java 环境的计算机若干台 三、实验内容和要求: 1.输入并运行下面的程序,体会各种基本数据类型的变量......JAVA循环语句练习(附答案及代码),使用前请先将拓展名改为.java,即可直接在cmd通过javac和java编译运行. /**一、选择题答案: * 1.C 2.B 3.C 4.D 5.C......实验二 Java基...

weixin_33982972的博客 2754

解锁RK平台黑科技:DPDK加速与硬件卸载实战

本文探讨了在RK平台上通过DPDK加速与硬件卸载技术构建高性能网络架构的方法。RK平台凭借强大的硬件性能为高并发网络处理提供基础,而DPDK通过用户态驱动、轮询机制等技术绕过内核瓶颈,显著提升数据包处理效率。硬件卸载则将校验和计算等任务交由专用硬件,释放CPU资源。实践案例显示,该方案可使网络吞吐量提升至理论极限,延迟降至5ms以下,CPU利用率降低40%。文章详细介绍了配置步骤、优化方法和常见问题解决方案,并展望了该技术在5G、车联网等新兴领域的应用前景。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1275

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

简单条件语句2编译器

1.1 概述编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,在系统软件中占有十分重要的地位。编译原理课程设计是本课程重要的综合实践教学环节,是对平时实验的一个补充。通过编译器相关子系统的设计,使学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识;培养学生独立分析问题、解决问题的能力,以及系统软件设计的能力;培养学生的创新能力及团队协作精神。

baoanchen的博客 674

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【编译原理课程设计二】 --- Java实现 语法分析:分析算术表达式的语法结构+对语句进行语法分析+递归下降的语法分析

语法分析:分析任意一个算术表达式的语法结构+对高级程序设计语句进行语法分析+递归下降的语法分析

qq_62711363的博客 820

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

语法分析——在之前基础上增加定义语句打印,定义语句判断,增加对if-else-then的条件语句的判断

这是对之前的代码的扩充。 #include using namespace std; /* 变量说明: line 从终端读入的字符串; 当前所指位置在计数器 p token 为存放的单词自身字符串;当前所指位置在计数器 m number 整型常数 sym 每个单词符号种类 */ enum symbol { period=0, ident=1, numbe

IPOmonkey的博客 461

简易的编译器——语法分析

小而简易的编译器——语法分析

随风小江~ 1024

XJTUSE-编译原理实验-语法分析

首先,在学习LL(1)文法的相关知识时,我发现它具有诸多优点,如分析过程直观、分析效率高、错误诊断容易等。这使得它成为编译原理课程中广泛使用的一种文法形式。在实际编写语法分析程序的过程中,我也亲身体会到了这些优势。在编写程序的过程中,最大的收获就是加深了对first集和follow集概念的理解。这两个集合的计算方法是构建预测分析表的关键,正确掌握它们对于实现递归下降分析算法至关重要。通过反复练习,我逐渐熟练掌握了计算first集和follow集的技巧,这也为后续的程序实现奠定了坚实的基础。

weixin_64112516的博客 1499

c语言语法语义解析器,一个简单的C语言词法分析与语法分析器【原】

词法分析可识别内容:标识符:id数字:num关键字:int,char,if,else,while,do,for标号:, , . , ;算术运算符号:=,+,-,*,/,&,!,|,&&,||关系运算符:=,>,==,!=注释://内码定义:单个符号,如{,+,*,> 等,均使用其ascii码做内码,占双或多个字节的符号(包括保留字,标号,数字,运算符等)为其取...

weixin_35954566的博客 2889

【编译原理】WHILE循环语句的翻译程序设计与实现(递归下降法、输出四元式)(赋值语句的词法分析、语义分析)

注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 项目下载地址:https://download.youkuaiyun.com/download/cxh_1231/10916735 纸上得来终觉浅,觉知此事需躬行! 0、笔者: 编译原理课程一共有两次实验和一次课内实践。前两次实验分别是: 赋值语句的词法分析程序设计与实现 赋值语句的语义分析程序设计与实现 而课内实践的内容是:WHI...

拾年之璐 1万+

编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

实验报告三:语法分析一、实验目的       通过设计、开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力。二、实验要求       根据下列S语言的语法规则,进行语法分析(1) &lt;程序&gt;→[&lt;常量说明&gt;][&lt;变量说明&gt;]&lt;语句&gt;(2) &lt;常量说明&gt;→Const &lt...

boss_crabe的博客 1万+

语法分析与中间代码生成

  这章和上一章(属性文法和语法制导翻译)是紧密联系的,共同完成了编译过程的第三步——语义分析与中间代码产生。   开篇先解释两个问题:     1. 什么是语义分析?它和之前几部分有什么不同呢?     2. 什么是中间代码?为什么需要产生中间代码?   问题一:什么是语义分析?它和之前几部分有什么不同呢?   词法分析主要完成的是标识符/算符等等定义是否符合规定。语法分析是看程序的结构是否符合文法的要求,也就是下一部分接这个对不对?语义分析就上升到概念层了,我以C语言举个例子:使用一个变量之前必须对这个

gls_nuaa的博客 3710

编译器中的赋值语句转换与优化技术详解

赋值语句作为编程基础结构,其转换过程涉及抽象语法树(AST)构建、类型检查与中间代码生成等核心环节。编译器通过三地址码转换实现操作分解,并应用常量传播、复制传播等优化技术提升执行效率。在目标代码生成阶段,寄存器分配和特殊场景处理(如结构体赋值、原子操作)直接影响程序性能。现代语言特性如解构赋值和延迟求值进一步扩展了赋值语义,而静态分析和动态检查工具则帮助开发者识别潜在问题。理解赋值语句的底层转换原理,对于编写高性能代码和充分利用编译器优化至关重要,特别是在数值计算、函数式编程等特定领域。

weixin_30268071的博客 324

用switch语句给数组变量赋值_用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2...

项目github地址及源码:yunwei37/tryC​github.comtryC的语法分析完整的tryC文法:(这里我们用单引号包裹那些在BCNF文法定义中出现但又作为终结符出现的字符)exp statement的代码实现布尔表达式和算术表达式的代码之前已经讲过了,这里看看statement的实现,以及如何在语法分析的同时解释执行:这里使用的方法是,对于流程控制语句,在语法分析的时候就进行条件...

weixin_39707725的博客 179
上一篇: 词法分析——判断单词类别并输出
下一篇: 语法分析——在之前基础上增加定义语句打印,定义语句判断,增加对if-else-then的条件语句的判断
ipomonkey
博客等级 码龄10年 22粉丝 50原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值