编译原理及实践1

NFA 不确定的有限自动机, 

DFA确定的有限自动机

区别是前者有空集


推到及由文法定义的语言

A->Aa|a 左递归

A->aA|a 右递归


正则表达式->文法

a* => A->Aa|empty 

a* => A->aA|empty


BNF

巴科斯范式来定义编程语言的语法规则

分析树

最左推到和最有推到

抽象语法树


二义性

解决二义性,可使用BNF中的优先级联
运算左结合及优先级:
exp -> exp addop term|term
addop -> +|-
term -> term mulop factor |factor
mulop -> *
factor ->(exp) | num

BNF可表达的乘坐语法,其他的称作语意


乔姆斯基层次

非限制的,上下文有关,上下文无关,正则分别称为0型...



算术表达式的EBNF文法实现程序

// EBNF.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*

exp -> term { addop term}
addop -> +|-
term -> factor { mulop factor }
mulop -> *
factor -> (exp) | num
*/


char token;
int exp(void);
int term(void);
int factor(void);

void error(void)
{
	printf("Error\n");
	printf("token : %c ", token);
	token=getchar();
	printf("token : %c ", token);
	system("pause");
	exit(1);
}
void match(char expectedToken)
{
	if(token == expectedToken)
		token = getchar();
	else
		error();
}
int _tmain(int argc, _TCHAR* argv[])
{
	int result;
	token = getchar();
	result = exp();
	if(token == '\n')
		printf("reslut = %d \n", result);
	else
		error();
	system("pause");
	return 0;
}

int exp(void)
{
	int tmp = term();
	while(token == '+' || token == '-')
	{
		switch(token)
		{
		case '+':
			match('+');
			tmp += term();
			break;
		case '-':
			match('-');
			tmp -= term();
			break;
		default:
			error();
		}
	}
	
	return tmp;
}

int term(void)
{
	int tmp = factor();
	while(token == '*')
	{
		match('*');
		tmp *= factor();
	}
	return tmp;
	
}

int factor(void)
{
	int tmp;
	if(token == '(')
	{
		match('(');
		tmp = exp();
		match(')');
	}
	else if(isdigit(token))
	{
		ungetc(token, stdin);
		scanf("%d", &tmp);
		token = getchar();
	}
	else error();
	return tmp;
	
}






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值