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;
}