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

CMM语法分析(C++实现) 语法分析,采用递归下降实现(本人觉得LL(1)看着太麻烦了),使用 构造了一个树节点的类用来存储(本来没写,后来不知道怎么打印语法树就写了下,写了之后还是不清楚怎么打印语法树—_—,现在看来太蠢了,不知道那位仁兄有更好的方法赐教一下) 文法:(该文发修改自一位仁兄,现在找不到链接了,若原作者或之情人士看到请提醒我) (该文发规定较为严格,对于if-else必须使用if(条件){语句},{}不 阅读详情

这是对之前的代码的扩充。

#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,
    elsesym=24,
    intsym=25,
    doublesym=26,
    floatsym=27,
    longsym=28,
    comma=29,
    nil=30,
};

char line[100],token[10],ch;
enum symbol sym;
int p,m, num;
char *word[11]= {"begin","end", "if","then","while","do","else","int","double","float","long"};
int Err;
bool flag=true;

void getsym();
int block();
void error(int i);
void statement();
void expression();
void term();
void factor();
void condition();
void Relational_operator();
void is_ident();
vector<string> define;

int main()
{
	//freopen("tt.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';
	define.clear();
    //逐个单词扫描;
    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("(    number,%-10d)\n",num);
		break;
	case nil:
		printf("you have input a wrong string\n");
		break;
	case note:
		printf("this is notes\n");
		break;
	case Plus:
		printf("(      Plus,%-10s)\n","+");
		break;
	case Minus:
		printf("(     Minus,%-10s)\n","-");
		break;
	case times:
		printf("(     times,%-10s)\n","*");
		break;
	case slash:
		printf("(     slash,%-10s)\n","/");
		break;
	case eql:
		printf("(       eql,%-10s)\n","=");
		break;
	case neq:
		printf("(       neq,%-10s)\n","><");
		break;
	case lss:
		printf("(       lss,%-10s)\n","<");
		break;
	case leq:
		printf("(       leq,%-10s)\n","<=");
		break;
	case gtr:
		printf("(       gtr,%-10s)\n",">");
		break;
	case geq:
		printf("(       geq,%-10s)\n",">=");
		break;
	case lparen:
		printf("(    lparen,%-10s)\n","(");
		break;
	case rparen:
		printf("(    rparen,%-10s)\n",")");
		break;
	case semicolon:
		printf("( semicolon,%-10s)\n",";");
		break;
	case comma:
		printf("(     comma,%-10s)\n",",");
		break;
	case becomes:
		printf("(   becomes,%-10s)\n",":=");
		break;
	case beginsym:
		printf("(  beginsym,%-10s)\n","begin");
		break;
	case endsym:
		printf("(    endsym,%-10s)\n","end");
		break;
	case ifsym:
		printf("(     ifsym,%-10s)\n","if");
		break;
	case thensym:
		printf("(   thensym,%-10s)\n","then");
		break;
	case whilesym:
		printf("(  whilesym,%-10s)\n","while");
		break;
	case dosym:
		printf("(     dosym,%-10s)\n","do");
		break;
	case elsesym:
		printf("(   elsesym,%-10s)\n","else");
		break;
	case intsym:
		printf("(  intsym,%-10s)\n","int");
		break;
	case doublesym:
		printf("(    doublesym,%-10s)\n","double");
		break;
	case floatsym:
		printf("(     floatsym,%-10s)\n","float");
		break;
	case longsym:
		printf("(   longsym,%-10s)\n","long");
		break;
	case ident:
		printf("(     ident,%-10s)\n",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<11;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;
				else if(n==6) sym=elsesym;
				else if(n==7) sym=intsym;
				else if(n==8) sym=doublesym;
				else if(n==9) sym=floatsym;
				else if(n==10) sym=longsym;
				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=comma;
			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 10:
		printf("Error %d: 没有检测到标识符\n",i);
		break;
    case 11:
        printf("Error %d: 没有检测到语句期望 end 符号\n", i);
        break;
	case 12:
		printf("Error %d: 没有检测到定义结束标记 ; 符号\n", i);
        break;
	case 13:
		printf("Error %d: %d 处的 %s 没有定义\n", i,p,token);
        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: 语句处理(赋值/条件/循环) *****
     *******************************************/
	cout<<"语句处理\n";
    if(sym==ident)
    {
        //赋值语句
        cout<<"赋值语句分析\n";
        getsym();
        if(sym==becomes)
        {
            getsym();
            expression();
            //printf(" print( %s ) ",token);
        }
        else
        {
        	error(2);
            //printf("Error!赋值语句左部标识符后面应是赋值号 ':='\n");
            return;
        }
    }
    else if(sym==ifsym)
    {
        //条件语句
        cout<<"条件语句分析\n";
        getsym();
        condition();
        if(sym==thensym)
        {
        	getsym();
            statement();
            if(sym==elsesym){
				cout<<"else语句分析\n";
				getsym();
				statement();
            }
            else if(sym==endsym){
				return;
            }
            else{
				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 if(sym==intsym||sym==doublesym||sym==floatsym||sym==longsym){
		//变量定义语句
		cout<<"变量定义语句分析\n";
		getsym();
		is_ident();
		getsym();
		while(sym==comma){
			getsym();
			is_ident();
		}
		if(sym!=semicolon){
			error(12);
			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)
    {
    	string s(&token[0],&token[strlen(token)]);
		vector<string>::iterator result=find(define.begin(),define.end(),s);
		if ( result == define.end()){
			error(13);
		}
		else getsym();

	}
    else if(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;
    }
}

void is_ident()
{
	cout<<"标识符处理\n";
    /********************************************
     *************** TODO: 关系运算符 *************
     *******************************************/
    if(sym==ident)
	{
		//getsym();
		define.push_back(token);
	}
    else
    {
    	error(10);
        //printf("Error!缺少关系运算符\n");
        return;
    }
}



〔重庆理工大学〕编译原理语法分析源代码【实验一 设计递归下降子程序对语法分析】 本文描述了一个语法分析实验任务,要求基于给定的类C语言文法扩展新的语法成分并实现递归下降分析器。实验需要完成以下工作:1) 补充for语句、do-while语句、continue/break语句和函数调用的文法规则;2) 设计递归下降子程序分析所有语法成分;3) 输出包含词法信息和语法成分名称的结果文件。输入文件为input.txt,输出文件为output.txt需包含单词信息和语法成分标记(如<FunctionDef>)。文章提供了部分参考代码和基础文法规则,涉及程序结构、声明、控制语句和表达 阅读详情

相关推荐

C++写的PL0编译器教学源码,带FOR循环、ELSE分支、自增自减和两种注释支持

这个PL0编译器用C++实现,覆盖编译原理四大阶段:词法分析、语法分析、语义分析和目标代码生成。支持标准PL0语法基础上扩展了ELSE条件分支、Pascal风格的FOR循环(含TO/DOWNTO步进控制)、++/--运算符、<>不等号写法;注释功能完整,兼容//单行注释和/*...*/块注释。源码结构清晰,包含Unit1.cpp、PL01.cpp、main.cpp等核心文件,搭配详细项目说明.md文档,里面列出了文法定义、语法图、语义动作实现逻辑和测试用例执行过程。所有代码已在Windows平台通过C++

html8的博客 190

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

语法分析小程序。简单判断赋值、条件、循环,代码块开始,结束 二、     实验要求 1.待分析的简单语言的语法 用扩充的EBNF表示如下: 程序块>::= begin{;} end. ::= || ::= IDENT:= ::= if then ::= while do ::= [+|-]{(+|-)} ::= {(*|/)} ::= IDENT | NUMBER

IPOmonkey的博客 6284

语法分析-if-else的匹配问题

语法分析-if-else的匹配问题语法分析-if-else的匹配问题

if then 条件判断语句和 if then else

1.if-then 语句 在结构化命令中,最基本就实if -than语句,格式如下: if  commands then          commands fi 执行后结果: 复制代码: #!/bin/bash testuser=smart                                         #定义变量testuser赋值smart if gr...

xtggbmdk的博客 7万+

mobaXterm连接vmWare虚拟机上的centOS7提示连接失败的解决方法

1.问题描述: mobaXterm安装后连接虚拟机vmWare上的centOS7发现连接不上,如下图所示: 2.解决方法 先是查了一下centOS的ip 开始错误的以为 virbr0: 后面的inet就是虚拟机的IP 实则不然(正确的ip是在ens33后面的inet中的ip,大佬们勿喷) 这个值需要配置一下的,具体配置过程如下: step1: 进入centOS下的/...

hss19214的博客 7890

[编译原理]从if-then-else看二义性

在研究语法分析器时,大部分语法分析器都期望文法是无二义性的,否则,我们就不能为一个句子唯一地选定语法分析树。但是在某种情况下,使用经过精心选择的二义性文法可以带来方便。此时需要使用消二义性规则来“抛弃”不想要的语法分析树,只为每个句子留下一棵语法分析树。       假如我们要将if then else语句加入某一文法G中,我们可以给出无二义性文法如下:

3435

STM32+ESP8266接入OneNet的MQTT嵌入式实现

MQTT是一种轻量级发布/订阅模式的消息传输协议,广泛应用于资源受限的物联网终端设备通信。其基于TCP/IP栈构建,具备低带宽占用、小代码体积和高可靠性等技术优势,特别适合STM32等MCU与Wi-Fi模组协同工作的边缘节点场景。在实际工程中,需结合AT指令集控制ESP8266完成Wi-Fi连接、TCP建链及MQTT会话管理,并通过环形缓冲区、空闲中断检测等机制保障UART异步通信稳定性。本文围绕STM32F103与ESP8266硬件协同、OneNet平台对接、JSON消息解析与OLED状态反馈等关键环节,

yhn456789的博客 1035

编译原理(二)——语法分析(一)

版权声明:本文为原创文章,未经博主允许不得用于商业用途。 语法分析 上下文无关文法(CFG) 1.1 基本定义 CFG包含如下四个组成部分: 终结符号:组成串的基本符号(词法单元名,id,运算符) 非终结符号:表示串的集合的语法符号(如expr,stmt) 开始符号:某个被指定的非终结符(如expr) 产生式:定义了使用非终结符和终结符狗构造串的方法。 形式:头(左)部→\rightarrow...

lengjiayi的博客 2471

Xilinx XDMA驱动代码分析及用法

Xilinx XDMA驱动代码分析及用法 先简单的介绍一下,赛灵思的XDMA的驱动是用于做什么的、他的主要功能就类似与网卡pcie接口的网卡驱动、用于控制主机与fpga设备进行pcie的通讯。通讯的主要方式是设备文件的读写,这里不清楚的同学可以看一下我上一篇文章。通过控制设备文件的读写,操作驱动与fpga设备进行数据传输。 1、目录结构 zacha@Superman:~/nfs/xdma-debug/dma_ip_drivers-master/XDMA/linux-kernel$ tree -C . ├──

恍恍惚惚的大穷猫的博客 3万+

计算机视觉安防监控升级:人脸识别与行为异常检测

计算机视觉安防监控升级:人脸识别与行为异常检测 ,人工智能,计算机视觉,大模型,AI,本文将深入探讨人脸识别与行为异常检测技术在安防监控中的应用,包括技术原理、算法实现、应用场景以及面临的挑战与解决方案。通过实际案例和代码示例,帮助读者更好地理解和掌握这些技术,为推动安防监控系统的智能化升级提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 23万+

if-else

if-else 当 if 语句判断表达式的结果为 True 时,就会执行 if 包含的代码块: if age >= 18: print 'adult' 如果我们想判断年龄在18岁以下时,打印出 'teenager',怎么办? 方法是再写一个 if: if age : print 'teenager' 或者用 not 运算: if not age

huangmin113659的专栏 339

RK3588 buildroot 制作的系统增加 docker 支持

RK3588 使用buildroot制作的系统添加 docker 和 docker-compose 的功能

荻夜的博客 1567

编译原理 C-Minus 语法分析(Flex / Bison)

C-Minus 源代码 语法分析 文章目录C-Minus 源代码 语法分析一、实现目标二、实现过程1. 综述 一、实现目标   在上一篇文章(C-Minus词法分析)中,我们实现了对C-Minus语言(C语言子集)书写的源代码进行词法分析,并打印分析结果;关于C-Minus语法的详细内容请参考上篇文章。而在本篇文章中,我们将运用语法分析相关知识,编写一个程序对使用类C语言书写的源代码进行语法分析,并打印分析结果。   至少实现最低要求:输出语法分析树,并能定位错误信息。   实现方式:可以选择手工编写(递归

Gyc8787的博客 6159

华为OD 面试手撕代码真题【判断链表是否有环】

华为OD 面试手撕代码真题【判断链表是否有环】

MISAYAONE的博客 7225

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 352

Js分支语句

如果所有的条件都为 false, 且没有最后的 else {} 分支, 那么当前 if 分支不会有任何代码段会被执行。console.log('num 为偶数') : console.log('num 为奇数')- 语法: `if(条件1){条件1为true时执行} else if (条件2){条件2为true时执行}`- 语法: `if (条件) { 条件为真时 执行的代码 } else { 条件为假时 执行的代码 }`{}: 花括号内部填写要执行的分支代码, 如果条件为真, 则会执行。

m0_73384555的博客 224

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

编译原理 实验 课程设计 PL0编译器扩充(for to do,增加char和int类型,翻转if else then )

②FOR := DOWNTO DO ①FOR := TO DO (1)增加单词:保留字 FOR,TO,DOWNTO;5. 扩充语句(语义):else条件语句的语义处理。其中,语句①的循环变量的步长为1,(2)修改单词:不等号# 改为 (3)扩充赋值运算:+= 和 -=语句②的循环变量的步长为-1。2.状态标记getSym()(3)双字符单词+=,++(1)保留字else。

lglight的博客 1541

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

告别if-else:用声明式规则语言构建轻量级业务规则引擎

在软件开发中,业务规则长期以来依赖if-else等命令式代码实现,但随着规则数量膨胀,规则与流程逻辑耦合、评审困难、变更成本高的问题愈发突出。声明式规则语言通过将“规则内容”与“执行过程”分离,使规则以接近业务语义的文本形式独立存在,由规则引擎统一解析与执行。这种设计显著提升了规则的可读性、可测试性和可维护性,并支持规则外部化与动态变更,在电商折扣、风控决策、优惠计算等场景应用广泛。以Java环境为例,从词法分析、语法解析到执行器,可以构建一个极简规则引擎,并借助Spring Boot实现规则文件外部加载与

weixin_30740295的博客 698

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【人工智能】python之控制语句练习

我们都知道程序等于数据结构和算法的集合、前面几节练习的都是数据结构,字符串,列表,元组,字典都是存储数据的结构。下面我们来练习算法,也就是我们经常操作的if esle ,for 循环的等等这类都是就是算法,正是数据结构加算法组成了程序。下一行缩进,执行条件下的内容,显然因为布尔值是false ,所以不会打印。#多个条件组合判断,多个分支,通过if elif else 组合。接下来就是来分析一下条件语句的语法和使用技巧。#通过not 置换布尔值。#变量,赋予一个布尔值。

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 326

Tabloid控制流完全教程:WHAT IF条件判断、LIES!分支与RUMOR HAS IT作用域

Tabloid 是一门灵感来自"标题党新闻"的图灵完备编程语言,它的控制流系统只用 3 个关键词就干掉了其他语言里 if / else / 花括号的全部工作。本教程面向新手,手把手讲清 `WHAT IF` 条件判断、`LIES!` 分支和 `RUMOR HAS IT ... END OF STORY` 代码块(作用域),读完你就能独立写出带递归的 Tabloid 程序。 [![Tabloid控制

gitblog_00418的博客 916

js的语句

如果没有 break, 一直执行代码直到遇到一个 break 或者 switch 结束。从第一个满足条件的 case 开始。

2201_75904766的博客 132

实验报告:LR语法分析

yylex的返回的是词法记号(单词编号),而一词法记号有相应的属性:标识符、常数等。使用%token等定义LCC语言的关键字、数据类型、常数、字符串常量、比较符号、赋值符号及标识符;⑤ $1:指产生式右侧从左到右第1个符号在数值栈所对应的值,此处为NUMBER对应的数值,即当前yylval的值。③ 数值栈(语义栈):执行相应的出栈、入栈动作,其类型与yylval相同,具体的值由用户规定;④ $$:指的该产生式归约后数值栈栈顶元素,此处为expr具体的数值;② 状态栈:执行相应的出栈、入栈动作;

瑞瑞ruirui的博客 1512

Bison实战:从文法定义到语法分析树的构建

本文详细介绍了Bison工具在编译原理中的应用,从基础文法定义到语法分析树的构建。通过实战案例和代码示例,展示了如何使用Bison处理复杂语法、解决运算符优先级问题,并与Flex协同工作实现词法和语法分析。文章还提供了常见问题的解决方案和性能优化技巧,适合编译原理学习者和开发者参考。

raspberrypi5的博客 155

Go语言条件控制:从语法规范到生产级防御性编程

条件语句是程序逻辑分支的基石,其本质是布尔表达式求值与控制流跳转的结合。在Go语言中,这一机制被高度简化——无括号、无隐式转换、无自动else补全,从而将逻辑严谨性完全交由开发者掌控。理解if/else链的执行顺序、短路求值的副作用、短变量声明的作用域边界,以及switch与if-else的性能与可维护性差异,是写出高可靠代码的前提。尤其在微服务与高并发场景下,nil检查顺序、边界条件遗漏、变量遮蔽、竞态条件等常见陷阱,往往成为线上panic与超时的根源。本文聚焦Go条件控制的底层原理与工程实践,融合错误优

weixin_34037173的博客 600
上一篇: 语法分析——简单判断条件语句,赋值语句,循环语句
下一篇: 编译原理综合应用——Java文件打点
ipomonkey
博客等级 码龄10年 22粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值