最近无事 在看书的时候发现了这个东西 刹那间突然觉得大学时候编译原理书上的的什么语法分析书、上下文无关等晦涩难懂的概念清晰了许多 今天把它贴出来 希望也能让你回想起些往事。。。 至于EBNF范式是什么东西,网上有详细的介绍,在此就不作赘述。 在这里,使用EBNF范式来实现一个简单算术运算的语法描述,然后用C语言实现。 该算术运算要实现的功能: (1)能够进行加法、乘法运算,且乘法优先于加法运算 (2)实现'('、')'运算,且其优先级高于乘法运算 使用EBNF范式修改后的简单整数算术运算的语法描述: expr-->expr+term|term term-->term*factor|factor factor-->(expr)|number number-->number digit|digit digit-->0|1|2|3|4|5|6|7|8|9 实现代码如下: #include<stdio.h> #include<stdlib.h> #include<ctype.h> int token; //holds the current input character for the parse void error(void) { printf("parse error\n"); exit(1); } void getToken(void) { token=getchar(); } void match(char c) { if(token==c) getToken(); else error(); } //command-->expr'\n' void command(void) { int result=expr(); if(token=='\n') printf("The result is :%d\n",result); else error(); } //expr-->term { '+' term} int expr(void) { int result=term(); while(token=='+') { match('+'); result+=term(); } return result; } //term-->factor { '*' factor} int term(void) { int result=factor(); while(token=='*') { match('*'); result*=factor(); } return result; } //factor-->‘(’ expr ')' | number int factor(void) { int result; if(token=='(') { match('('); result=expr(); match(')'); } else result=number(); return result; } //number-->digit { digit } int number(void) { int result=digit(); while(isdigit(token)) { result=10*result+digit(); } return result; } //digit-->'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' int digit(void) { int result; if(isdigit(token)) { result=token-'0'; match(token); } else error(); return result; } void parse(void) { getToken(); command(); } main() { parse(); return 0; }