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


词法分析
可识别内容:
标识符:id
数字:num
关键字:int,char,if,else,while,do,for
标号:, , . , ;
算术运算符号:=,+,-,*,/,&,!,|,&&,||
关系运算符:<,<=,>=,>,==,!=
注释://

内码定义:
单个符号,如{,+,*,> 等,均使用其ascii码做内码,占双或多个字节的符号(包括保留字,标号,数字,运算符等)为其取名如下:
Enum { END=0,INT,CHAR,IF,ELSE,WHILE=5,
DO,FOR,ARGAND,ARGOR,NUM=10,
ID,LESSEQUAL,EQUAL,GREATEQUAL,NOTEQUAL=15 };
其中NUM代表数字,ID代表标识符.

测试程序1-1的词法分析结果如下:

内码表
123{
11X
61=
1012
43+
43+
11b
47/
1013
45-
105
42*
104
42*
109
59;
11Y
61=
104
42*
101024
59;
3if
40(
11X
14>=
11Y
41)
123{
3if40(
11i
13==
11i
41)
123{
11X
61=
11Y
125}
125}
59;
59;
59;
59;
5while
40(
11X
60<
11Y
41)
123{
11X
61=
11X
43+
101
59;
125}
125}


语法分析
C语言子集,可支持
语句块,语句,条件语句,While循环语句,赋值语句,基本算术表达式等。例如:
{
// Comment Supported : This is only a Test ^_^

X = 12 + b / 13 - 5 * 4 * 9;// A AssignmentStatement
Y = 4 * 1024;
if( X >= Y){
if( i == i){// This is nested if Statement
X=Y;
}
}
;;;;// This is Null Statement
while( X < Y){// This is while Statement
X = X +1;
}
}
测试程序1-1

支持错误检测,如将上面例子中X = 12 + b / 13 - 5 * 4 * 9;
故意修改为:X = 12 ++ b / 13 - 5 * 4 * 9; 则会出现如下错误提示,指示了出错行数和行内偏移位置:

规则如下:
<StatementBlock> ::= '{'<StatementSequence>'}'
<StatementSequence> ::= {<NullStatement>|<CommonStatement>|<VariantStatement>}

<NullStatement> ::= ';'
<CommonStatement> ::= <AssignmentStatement>
<VariantStatement> ::= <ConditionStatement>| <LoopWhileStatement>

<AssignmentStatement> ::= ID=<Expression>
<ConditionStatement> ::= if(<Condition> <StatementBlock>
<LoopWhileStatement> ::= while(<Condition> <StatementBlock>

<Condition> ::= <Expression><RelationOperator><Expression>
<Expression> ::= <Item>{+<Item>|-<Item>}
<Item> ::= <Factor>{*<Factor>|/<Factor>}
<Factor> ::= ID|NUM|(<Expression>)
<RelationOperator> ::= <|<=|>=|>|==|!=

//非终结符的英文定义
void StatementBlock();//语句块
void StatementSequence();//语句串

// XxxxxStatement() 为三类语句
void NullStatement();//空语句--仅仅含有一个;号
void CommonStatement();//语句
void VariantStatement();//变种语句--包括 if(){},while{},他们都不以;结尾

// 下面的属于CommonStatement
void AssignmentStatement();//赋值语句

// 下面两种属于VariantStatement
void ConditionStatement();//条件语句
void LoopWhileStatement();//while循环语句

void Condition();//条件
void Expression();//表达式
void Item();//项
void Factor();//因子
void RelationOperator();//关系运算符


不能支持的主要方面:函数调用的识别,逗号表达式,for循环,switch语句。


词法分析:

一个简单的C语言词法分析与语法分析器【原】//LexAly.cpp:C子集词法分析程序
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
/**//*
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】支持内容:
一个简单的C语言词法分析与语法分析器【原】标识符:id
一个简单的C语言词法分析与语法分析器【原】关键字:int,char,if,else,while,do,for
一个简单的C语言词法分析与语法分析器【原】标号:,,.,;
一个简单的C语言词法分析与语法分析器【原】算术运算符号:=,+,-,&,!,|,&&,||
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】全局字符串:
一个简单的C语言词法分析与语法分析器【原】instr记录待解析的字符串
一个简单的C语言词法分析与语法分析器【原】string存贮当前被解析到的ID
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】接口:
一个简单的C语言词法分析与语法分析器【原】gettoken();
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】Sample:
一个简单的C语言词法分析与语法分析器【原】输入:
一个简单的C语言词法分析与语法分析器【原】instr=
一个简单的C语言词法分析与语法分析器【原】for(i=0;i<10;i++){
一个简单的C语言词法分析与语法分析器【原】j=i+10;
一个简单的C语言词法分析与语法分析器【原】printf("%d",j);
一个简单的C语言词法分析与语法分析器【原】}
一个简单的C语言词法分析与语法分析器【原】输出:
一个简单的C语言词法分析与语法分析器【原】for
一个简单的C语言词法分析与语法分析器【原】(
一个简单的C语言词法分析与语法分析器【原】i
一个简单的C语言词法分析与语法分析器【原】……
一个简单的C语言词法分析与语法分析器【原】}
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】注意:
一个简单的C语言词法分析与语法分析器【原】要记得处理程序中未显示出来的符号,如空白(''),回车(' '),值表符(' ')
一个简单的C语言词法分析与语法分析器【原】
*/

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】#include
"stdafx.h"
一个简单的C语言词法分析与语法分析器【原】#include
<ctype.h>
一个简单的C语言词法分析与语法分析器【原】#include
<stdlib.h>
一个简单的C语言词法分析与语法分析器【原】#include
<string.h>
一个简单的C语言词法分析与语法分析器【原】#include
"Constant.h"
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】extern
voidgrammar_check();
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//注意:这里累计数目(最大值)不能大于32(100000B)TOKEN
一个简单的C语言词法分析与语法分析器【原】
//enum{END=0,INT=1,CHAR,IF,ELSE,WHILE,DO,FOR,ARGAND,ARGOR,NUM,ID};
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
charindex[][20]=...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"ENDOFFile"},/**//*0END*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"int"},/**//*1INT*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"char"},/**//*2CHAR*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"if"},/**//*3IF*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"else"},/**//*4ELSE*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"while"},/**//*5WHILE*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"do"},/**//*6DO*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"for"},/**//*7FOR*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"&&"},/**//*8ARGAND*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"||"},/**//*9ARGOR*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{""},/**//*10NUM*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{""},/**//*11ID*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"<="},/**//*12LESSEQUAL*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"=="},/**//*13EQUAL*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{">="},/**//*14GREATEQUAL*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{"!="},/**//*15NOTEQUAL*/
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{""}/**//*16ID*/
一个简单的C语言词法分析与语法分析器【原】}
;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
charinput[10000]=...{0};
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
char*instr=input;
一个简单的C语言词法分析与语法分析器【原】
char*conststart_of_instr=input;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//string包含gettoken最新得到的id等串
一个简单的C语言词法分析与语法分析器【原】
//gym包含gettoken得到的内容的代号
一个简单的C语言词法分析与语法分析器【原】
//current_line包含当前行号
一个简单的C语言词法分析与语法分析器【原】
charstring[MAX_INDENT];
一个简单的C语言词法分析与语法分析器【原】
intsym;
一个简单的C语言词法分析与语法分析器【原】
intcurrent_line=1;
一个简单的C语言词法分析与语法分析器【原】
intstart_pos_of_current_line;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
char*strstart;//用于辅助识别num,id
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】
intgettoken();
一个简单的C语言词法分析与语法分析器【原】
int_gettoken();
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voiderror(char*cur);
一个简单的C语言词法分析与语法分析器【原】
char*getlinestring(intline,char*in_buf);
一个简单的C语言词法分析与语法分析器【原】
intnextline();
一个简单的C语言词法分析与语法分析器【原】
intgetline();
一个简单的C语言词法分析与语法分析器【原】
intgetcurrentpos();
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
intnextline()...{return++current_line;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
intgetline()...{returncurrent_line;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
intgetcurrentpos()...{return(int)instr;}
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
char*getlinestring(intline,char*in_buf)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
char*t=input;
一个简单的C语言词法分析与语法分析器【原】
inti=1;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
while(*t!=0&&i<line)...{
一个简单的C语言词法分析与语法分析器【原】
if(*t==' ')i++;
一个简单的C语言词法分析与语法分析器【原】t
++;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
intlen=0;
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
while(*t!=' ')...{
一个简单的C语言词法分析与语法分析器【原】in_buf[len]
=*t;
一个简单的C语言词法分析与语法分析器【原】len
++;
一个简单的C语言词法分析与语法分析器【原】t
++;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】in_buf[len]
=0;
一个简单的C语言词法分析与语法分析器【原】
returnin_buf;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voiderror(char*cur)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】printf(
"SpellErrorfoundatline%d ",getline());
一个简单的C语言词法分析与语法分析器【原】exit(
0);
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//语法分析
一个简单的C语言词法分析与语法分析器【原】
intmain_grammar(char*filename)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
inti;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】FILE
*f;
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(!(f=fopen(filename,"r")))...{
一个简单的C语言词法分析与语法分析器【原】printf(
"Failtoopensourcefile%s! ",filename);
一个简单的C语言词法分析与语法分析器【原】exit(
0);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
intk=0;
一个简单的C语言词法分析与语法分析器【原】
charc;
一个简单的C语言词法分析与语法分析器【原】
while((c=fgetc(f))!=EOF)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】input[k]
=c;
一个简单的C语言词法分析与语法分析器【原】k
++;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】input[k]
=0;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//打印出程序
一个简单的C语言词法分析与语法分析器【原】
printf("%s ",start_of_instr);
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//开始语法检查
一个简单的C语言词法分析与语法分析器【原】
grammar_check();
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】printf(
"Success! ");
一个简单的C语言词法分析与语法分析器【原】
return0;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//词法分析
一个简单的C语言词法分析与语法分析器【原】
intmain_spell(char*filename)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
inti;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】FILE
*f;
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(!(f=fopen(filename,"r")))...{
一个简单的C语言词法分析与语法分析器【原】printf(
"Failtoopensourcefile%s! ",filename);
一个简单的C语言词法分析与语法分析器【原】exit(
0);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
intk=0;
一个简单的C语言词法分析与语法分析器【原】
charc;
一个简单的C语言词法分析与语法分析器【原】
while((c=fgetc(f))!=EOF)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】input[k]
=c;
一个简单的C语言词法分析与语法分析器【原】k
++;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】input[k]
=0;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】printf(
"%s ",start_of_instr);
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
while((i=gettoken())!=END)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(i==ID)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%d %s ",i,string);
一个简单的C语言词法分析与语法分析器【原】
continue;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(i==NUM)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%d %s ",i,string);
一个简单的C语言词法分析与语法分析器【原】
continue;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(i<20)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%d %s ",i,index[i]);
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】}
else...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%d %c ",i,i);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
return0;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
intgettoken()
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
inti=(sym=_gettoken());
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】#
if0
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(i==ID)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%s",string);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(i==NUM)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%s",string);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(i<20)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%s",index[i]);
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】}
else...{
一个简单的C语言词法分析与语法分析器【原】printf(
"%c",i);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】#endif
一个简单的C语言词法分析与语法分析器【原】
returnsym;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
int_gettoken()
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
char*cp=instr;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
for(;;)...{
一个简单的C语言词法分析与语法分析器【原】
if(*instr==0)
一个简单的C语言词法分析与语法分析器【原】
returnEND;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
/**//*
一个简单的C语言词法分析与语法分析器【原】if(可能读入的字符>当前可用缓冲区大小)
一个简单的C语言词法分析与语法分析器【原】扩展缓冲区
一个简单的C语言词法分析与语法分析器【原】
*/

一个简单的C语言词法分析与语法分析器【原】
//int,char,if,else,while,do,for
一个简单的C语言词法分析与语法分析器【原】
switch(*instr)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
case'i':
一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='f'&&notda(instr[2]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】instr
+=2;returnIF;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='n'&&instr[2]=='t'&&notda(instr[3]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】instr
+=3;returnINT;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
//notakeyword.butanid.
一个简单的C语言词法分析与语法分析器【原】
strstart=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
case'c':
一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='h'&&instr[2]=='a'&&instr[3]=='r'&&notda(instr[4]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{instr+=4;returnCHAR;}
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'e':
一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='l'&&instr[2]=='s'&&instr[3]=='e'&&notda(instr[4]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{instr+=4;returnELSE;}
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'w':
一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='h'&&instr[2]=='i'&&instr[3]=='l'&&instr[4]=='e'&&notda(instr[5]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{instr+=5;returnWHILE;}
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
case'd':
一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='o'&&notda(instr[4]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{instr+=2;returnDO;}
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
case'f':
一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='o'&&instr[2]=='r'&&notda(instr[3]))
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{instr+=3;returnFOR;}
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
//dealwithIDs.
一个简单的C语言词法分析与语法分析器【原】
//EXCLUDE:i,c,d,e,w,f
一个简单的C语言词法分析与语法分析器【原】
case'a':;case'b':;
一个简单的C语言词法分析与语法分析器【原】
case'g':;case'h':;
一个简单的C语言词法分析与语法分析器【原】
case'j':;case'k':;case'l':;
一个简单的C语言词法分析与语法分析器【原】
case'm':;case'n':;case'o':;
一个简单的C语言词法分析与语法分析器【原】
case'p':;case'q':;case'r':;
一个简单的C语言词法分析与语法分析器【原】
case's':;case't':;case'u':;
一个简单的C语言词法分析与语法分析器【原】
case'v':;case'x':;
一个简单的C语言词法分析与语法分析器【原】
case'y':;case'z':;
一个简单的C语言词法分析与语法分析器【原】
case'A':;case'B':;
一个简单的C语言词法分析与语法分析器【原】
case'C':;case'D':;case'E':;
一个简单的C语言词法分析与语法分析器【原】
case'F':;case'G':;case'H':;
一个简单的C语言词法分析与语法分析器【原】
case'I':;case'J':;case'K':;
一个简单的C语言词法分析与语法分析器【原】
case'L':;case'M':;case'N':;
一个简单的C语言词法分析与语法分析器【原】
case'O':;case'P':;case'Q':;
一个简单的C语言词法分析与语法分析器【原】
case'R':;case'S':;case'T':;
一个简单的C语言词法分析与语法分析器【原】
case'U':;case'V':;case'W':;
一个简单的C语言词法分析与语法分析器【原】
case'X':;case'Y':;case'Z':;
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotoid_label;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
case'0':;
一个简单的C语言词法分析与语法分析器【原】
case'1':;case'2':;case'3':;
一个简单的C语言词法分析与语法分析器【原】
case'4':;case'5':;case'6':;
一个简单的C语言词法分析与语法分析器【原】
case'7':;case'8':;case'9':;
一个简单的C语言词法分析与语法分析器【原】strstart
=instr;
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
gotonum_label;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
case'{':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return'{';
一个简单的C语言词法分析与语法分析器【原】
case'}':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return'}';
一个简单的C语言词法分析与语法分析器【原】
case'(':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return'(';
一个简单的C语言词法分析与语法分析器【原】
case')':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return')';
一个简单的C语言词法分析与语法分析器【原】
case'+':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return'+';
一个简单的C语言词法分析与语法分析器【原】
case'-':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return'-';
一个简单的C语言词法分析与语法分析器【原】
case'*':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return'*';
一个简单的C语言词法分析与语法分析器【原】
case'/':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='/')...{////’形式的注释
一个简单的C语言词法分析与语法分析器【原】
instr+=2;
一个简单的C语言词法分析与语法分析器【原】
while(*(instr)!=10&&*(instr)!=0)
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
//instr++;
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
}
else...{//除号'/'
一个简单的C语言词法分析与语法分析器【原】
instr++;
一个简单的C语言词法分析与语法分析器【原】
return'/';
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'=':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='=')...{instr+=2;returnEQUAL;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
else...{instr++;return'=';}
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'<':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='=')...{instr+=2;returnLESSEQUAL;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
else...{instr++;return'<';}
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'>':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='=')...{instr+=2;returnGREATEQUAL;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
else...{instr++;return'>';}
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'!':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='=')...{instr+=2;returnNOTEQUAL;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
else...{instr++;return'!';}
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
case'&':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='&')...{instr+=2;returnARGAND;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='&'&&(isid(instr[2])||isspace(instr[2])))...{instr++;return'&';}
一个简单的C语言词法分析与语法分析器【原】error(instr);
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
case'|':
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='|')...{instr+=2;returnARGAND;}
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(instr[1]=='|'&&(isid(instr[2])||isspace(instr[2])))...{instr++;return'|';}
一个简单的C语言词法分析与语法分析器【原】error(instr);
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
case';':
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
return';';
一个简单的C语言词法分析与语法分析器【原】
case' ':
一个简单的C语言词法分析与语法分析器【原】
//printf("newline(%d) ",getline());
一个简单的C语言词法分析与语法分析器【原】
nextline();
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】start_pos_of_current_line
=(int)instr;
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
default:
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】id_label:
一个简单的C语言词法分析与语法分析器【原】
while(isid(*instr))
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】strncpy(string,strstart,instr
-strstart);
一个简单的C语言词法分析与语法分析器【原】string[instr
-strstart]=0;
一个简单的C语言词法分析与语法分析器【原】
returnID;
一个简单的C语言词法分析与语法分析器【原】num_label:
一个简单的C语言词法分析与语法分析器【原】
while(isdigit(*instr))
一个简单的C语言词法分析与语法分析器【原】instr
++;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//if(isalpha(*(instr+1))
一个简单的C语言词法分析与语法分析器【原】
//error(instr);让语法分析来做吧~
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】strncpy(string,strstart,instr
-strstart);
一个简单的C语言词法分析与语法分析器【原】string[instr
-strstart]=0;
一个简单的C语言词法分析与语法分析器【原】
returnNUM;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
intmain(intargc,char*argv[])
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(argc<=1||argc>=4)...{
一个简单的C语言词法分析与语法分析器【原】printf(
"Usage:>LexAly[g|s][filename] ");
一个简单的C语言词法分析与语法分析器【原】exit(
0);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(argc==3)...{
一个简单的C语言词法分析与语法分析器【原】argv[
1][0]=='g'?main_grammar(argv[2]):main_spell(argv[2]);
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】}
elseif(argc==2)...{
一个简单的C语言词法分析与语法分析器【原】argv[
1][0]=='g'?main_grammar("source2.txt"):main_spell("source2.txt");
一个简单的C语言词法分析与语法分析器【原】;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
return0;
一个简单的C语言词法分析与语法分析器【原】}

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


一个简单的C语言词法分析与语法分析器【原】//grammar.cpp:C子集语法分析程序
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
/**//*
一个简单的C语言词法分析与语法分析器【原】C语言子集,可支持
一个简单的C语言词法分析与语法分析器【原】语句块,语句,条件语句,While循环语句,赋值语句,基本算术表达式等。例如:
一个简单的C语言词法分析与语法分析器【原】{
一个简单的C语言词法分析与语法分析器【原】//CommentSupported:ThisisonlyaTest^_^
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】X=12+b/13-5*4*9;//AAssignmentStatement
一个简单的C语言词法分析与语法分析器【原】Y=4*1024;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】if(X>=Y){
一个简单的C语言词法分析与语法分析器【原】if(i==i){//ThisisnestedifStatement
一个简单的C语言词法分析与语法分析器【原】X=Y;
一个简单的C语言词法分析与语法分析器【原】}
一个简单的C语言词法分析与语法分析器【原】}
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】;;;;//ThisisNullStatement
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】while(X<Y){//ThisiswhileStatement
一个简单的C语言词法分析与语法分析器【原】X=X+1;
一个简单的C语言词法分析与语法分析器【原】}
一个简单的C语言词法分析与语法分析器【原】}
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】规则如下:
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】<StatementBlock>::='{'<StatementSequence>'}'
一个简单的C语言词法分析与语法分析器【原】<StatementSequence>::={<NullStatement>|<CommonStatement>|<VariantStatement>}
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】<NullStatement>::=';'
一个简单的C语言词法分析与语法分析器【原】<CommonStatement>::=<AssignmentStatement>
一个简单的C语言词法分析与语法分析器【原】<VariantStatement>::=<ConditionStatement>|<LoopWhileStatement>
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】<AssignmentStatement>::=ID=<Expression>
一个简单的C语言词法分析与语法分析器【原】<ConditionStatement>::=if(<Condition><StatementBlock>
一个简单的C语言词法分析与语法分析器【原】<LoopWhileStatement>::=while(<Condition><StatementBlock>
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】<Condition>::=<Expression><RelationOperator><Expression>
一个简单的C语言词法分析与语法分析器【原】<Expression>::=<Item>{+<Item>|-<Item>}
一个简单的C语言词法分析与语法分析器【原】<Item>::=<Factor>{*<Factor>|/<Factor>}
一个简单的C语言词法分析与语法分析器【原】<Factor>::=ID|NUM|(<Expression>)
一个简单的C语言词法分析与语法分析器【原】<RelationOperator>::=<|<=|>=|>|==|!=
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
*/

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】#include
"stdafx.h"
一个简单的C语言词法分析与语法分析器【原】#include
<ctype.h>
一个简单的C语言词法分析与语法分析器【原】#include
<conio.h>
一个简单的C语言词法分析与语法分析器【原】#include
<stdlib.h>
一个简单的C语言词法分析与语法分析器【原】#include
<string.h>
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】#include
"Constant.h"
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】extern
intgettoken();
一个简单的C语言词法分析与语法分析器【原】extern
intgetcurrentpos();
一个简单的C语言词法分析与语法分析器【原】extern
char*string;
一个简单的C语言词法分析与语法分析器【原】extern
intsym;
一个简单的C语言词法分析与语法分析器【原】extern
intcurrent_line;
一个简单的C语言词法分析与语法分析器【原】extern
intstart_pos_of_current_line;
一个简单的C语言词法分析与语法分析器【原】extern
char*getlinestring(intline,char*in_buf);
一个简单的C语言词法分析与语法分析器【原】extern
charinput[];
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//非终结符的英文定义
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】
voidStatementBlock();//语句块
一个简单的C语言词法分析与语法分析器【原】
voidStatementSequence();//语句串
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//XxxxxStatement()为三类语句
一个简单的C语言词法分析与语法分析器【原】
voidNullStatement();//空语句--仅仅含有一个;号
一个简单的C语言词法分析与语法分析器【原】
voidCommonStatement();//语句
一个简单的C语言词法分析与语法分析器【原】
voidVariantStatement();//变种语句--包括if(){},while{},他们都不以;结尾
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//下面的属于CommonStatement
一个简单的C语言词法分析与语法分析器【原】
voidAssignmentStatement();//赋值语句
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//下面两种属于VariantStatement
一个简单的C语言词法分析与语法分析器【原】
voidConditionStatement();//条件语句
一个简单的C语言词法分析与语法分析器【原】
voidLoopWhileStatement();//while循环语句
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】
voidCondition();//条件
一个简单的C语言词法分析与语法分析器【原】
voidExpression();//表达式
一个简单的C语言词法分析与语法分析器【原】
voidItem();//
一个简单的C语言词法分析与语法分析器【原】
voidFactor();//因子
一个简单的C语言词法分析与语法分析器【原】
voidRelationOperator();//关系运算符
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
/**//*
一个简单的C语言词法分析与语法分析器【原】注:以上未考虑函数调用表达式
一个简单的C语言词法分析与语法分析器【原】
*/

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidmatch_error(char*c)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
charerror_buf[1024];
一个简单的C语言词法分析与语法分析器【原】
intin_line_pos=getcurrentpos()-start_pos_of_current_line;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】printf(
"GrammarError! ");
一个简单的C语言词法分析与语法分析器【原】printf(
"Line%d[%d]:%sexpected ",current_line,in_line_pos,c);
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//获取错误行并打印出来
一个简单的C语言词法分析与语法分析器【原】
getlinestring(current_line,error_buf);
一个简单的C语言词法分析与语法分析器【原】printf(
"%s ",error_buf);
一个简单的C语言词法分析与语法分析器【原】
//输出错误指示点(NotExact!)
一个简单的C语言词法分析与语法分析器【原】
for(inti=1;i<in_line_pos;i++)
一个简单的C语言词法分析与语法分析器【原】printf(
"%c",'^');
一个简单的C语言词法分析与语法分析器【原】printf(
" ");
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】exit(
0);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//expecetedSym期望符号
一个简单的C语言词法分析与语法分析器【原】
//msg出错时给出的消息
一个简单的C语言词法分析与语法分析器【原】
voidmatch(intexpecetedSym,char*msg)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
if(expecetedSym!=sym)...{
一个简单的C语言词法分析与语法分析器【原】#
if0
一个简单的C语言词法分析与语法分析器【原】
if(sym<0x20)
一个简单的C语言词法分析与语法分析器【原】printf(
" Fail:ExpecetedSym=%dsym=%d ",expecetedSym,sym);
一个简单的C语言词法分析与语法分析器【原】
else
一个简单的C语言词法分析与语法分析器【原】printf(
" Fail:ExpecetedSym=%dsym=%c ",expecetedSym,sym);
一个简单的C语言词法分析与语法分析器【原】#endif
一个简单的C语言词法分析与语法分析器【原】match_error(msg);
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】gettoken();
//预读一个符号
一个简单的C语言词法分析与语法分析器【原】

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
voidgrammar_check()
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//printf("%s",input);
一个简单的C语言词法分析与语法分析器【原】
gettoken();//开始检查,填充预读区
一个简单的C语言词法分析与语法分析器【原】
//match('-',"DK");
一个简单的C语言词法分析与语法分析器【原】
StatementBlock();
一个简单的C语言词法分析与语法分析器【原】
if(sym!=END)match(END,"EndOfFile");
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidStatementBlock()//语句块
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】match(
'{',"{");//和预读符号比较
一个简单的C语言词法分析与语法分析器【原】
StatementSequence();
一个简单的C语言词法分析与语法分析器【原】match(
'}',"}");
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidStatementSequence()//语句串
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
while(sym==ID||
一个简单的C语言词法分析与语法分析器【原】sym
==IF||
一个简单的C语言词法分析与语法分析器【原】sym
==WHILE||
一个简单的C语言词法分析与语法分析器【原】sym
==';')
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】
while(sym==ID)//也可以用if(),但从统计角度看,while效率会略高。
一个简单的C语言词法分析与语法分析器【原】
//因为一般普通CommonStatement()出现概率较大
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】CommonStatement();
一个简单的C语言词法分析与语法分析器【原】match(
';',";");
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
while(sym==IF||
一个简单的C语言词法分析与语法分析器【原】sym
==WHILE)
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】VariantStatement();
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
while(sym==';')
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】NullStatement();
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidVariantStatement()//变种语句--包括if(){},while{},他们都不以;结尾
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
switch(sym)...{//若sym与下面两种均不匹配,什么也不做,空语句是也~
一个简单的C语言词法分析与语法分析器【原】
caseIF:
一个简单的C语言词法分析与语法分析器【原】ConditionStatement();
//条件语句
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
caseWHILE:
一个简单的C语言词法分析与语法分析器【原】LoopWhileStatement();
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
return;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidNullStatement()//空语句--仅仅含有一个;号
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】match(
';',";");
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidCommonStatement()//语句,以;结尾,但不以;开头
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
switch(sym)...{//若sym与下面任何一种均不匹配,什么也不做,空语句是也~
一个简单的C语言词法分析与语法分析器【原】
caseID:
一个简单的C语言词法分析与语法分析器【原】AssignmentStatement();
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
return;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidAssignmentStatement()//赋值语句
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】match(ID,
"ID");
一个简单的C语言词法分析与语法分析器【原】match(
'=',"=");
一个简单的C语言词法分析与语法分析器【原】Expression();
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidConditionStatement()//条件语句
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】match(IF,
"if");
一个简单的C语言词法分析与语法分析器【原】match(
'(',"(");
一个简单的C语言词法分析与语法分析器【原】Condition();
一个简单的C语言词法分析与语法分析器【原】match(
')',")");
一个简单的C语言词法分析与语法分析器【原】StatementBlock();
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidLoopWhileStatement()//循环语句
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】match(WHILE,
"while");
一个简单的C语言词法分析与语法分析器【原】match(
'(',"(");
一个简单的C语言词法分析与语法分析器【原】Condition();
一个简单的C语言词法分析与语法分析器【原】match(
')',")");
一个简单的C语言词法分析与语法分析器【原】StatementBlock();
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
voidCondition()//条件
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】Expression();
一个简单的C语言词法分析与语法分析器【原】RelationOperator();
一个简单的C语言词法分析与语法分析器【原】Expression();
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】
//<Expression>::=<Item>{+<Item>|-<Item>}
一个简单的C语言词法分析与语法分析器【原】
voidExpression()//表达式
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】Item();
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
while(true)...{//{+<Item>|-<Item>}可以有多个
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
switch(sym)...{
一个简单的C语言词法分析与语法分析器【原】
case'+':
一个简单的C语言词法分析与语法分析器【原】match(
'+',"+");
一个简单的C语言词法分析与语法分析器【原】Item();
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'-':
一个简单的C语言词法分析与语法分析器【原】match(
'-',"-");
一个简单的C语言词法分析与语法分析器【原】Item();
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
default:
一个简单的C语言词法分析与语法分析器【原】
return;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
return;
一个简单的C语言词法分析与语法分析器【原】
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
//<Item>::=<Factor>{*<Factor>|/<Factor>}
一个简单的C语言词法分析与语法分析器【原】
voidItem()//
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】Factor();
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
while(true)...{//{*<Factor>|/<Factor>}--可以有多个
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
switch(sym)...{
一个简单的C语言词法分析与语法分析器【原】
case'*':
一个简单的C语言词法分析与语法分析器【原】match(
'*',"*");
一个简单的C语言词法分析与语法分析器【原】Factor();
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'/':
一个简单的C语言词法分析与语法分析器【原】match(
'/',"/");
一个简单的C语言词法分析与语法分析器【原】Factor();
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
default:
一个简单的C语言词法分析与语法分析器【原】
return;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
return;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
//<Factor>::=ID|NUM|(<Expression>)
一个简单的C语言词法分析与语法分析器【原】
voidFactor()//因子
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
switch(sym)...{
一个简单的C语言词法分析与语法分析器【原】
caseID:
一个简单的C语言词法分析与语法分析器【原】match(ID,
"ID");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
caseNUM:
一个简单的C语言词法分析与语法分析器【原】match(NUM,
"NUM");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'(':
一个简单的C语言词法分析与语法分析器【原】match(
'(',"(");
一个简单的C语言词法分析与语法分析器【原】Expression();
一个简单的C语言词法分析与语法分析器【原】match(
')',")");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
default:
一个简单的C语言词法分析与语法分析器【原】match(ID,
"Afactor");//ID在这里肯定不match,利用它来报错(找不到因子)
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】
//<RelationOperator>::=<|<=|>=|>|==|!=
一个简单的C语言词法分析与语法分析器【原】
voidRelationOperator()//关系运算符
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
...{
一个简单的C语言词法分析与语法分析器【原】一个简单的C语言词法分析与语法分析器【原】
switch(sym)...{
一个简单的C语言词法分析与语法分析器【原】
case'<':
一个简单的C语言词法分析与语法分析器【原】match(
'<',"<");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
case'>':
一个简单的C语言词法分析与语法分析器【原】match(
'>',">");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
caseLESSEQUAL:
一个简单的C语言词法分析与语法分析器【原】match(LESSEQUAL,
"<=");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
caseGREATEQUAL:
一个简单的C语言词法分析与语法分析器【原】match(GREATEQUAL,
">=");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
caseEQUAL:
一个简单的C语言词法分析与语法分析器【原】match(EQUAL,
"==");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】
caseNOTEQUAL:
一个简单的C语言词法分析与语法分析器【原】match(NOTEQUAL,
"!=");
一个简单的C语言词法分析与语法分析器【原】
break;
一个简单的C语言词法分析与语法分析器【原】}

一个简单的C语言词法分析与语法分析器【原】}

核心:规则----

<StatementBlock> ::= '{'<StatementSequence>'}'
<StatementSequence> ::= {<NullStatement>|<CommonStatement>|<VariantStatement>}

<NullStatement> ::= ';'
<CommonStatement> ::= <AssignmentStatement>
<VariantStatement> ::= <ConditionStatement>| <LoopWhileStatement>

<AssignmentStatement> ::= ID=<Expression>
<ConditionStatement> ::= if(<Condition> <StatementBlock>
<LoopWhileStatement> ::= while(<Condition> <StatementBlock>

<Condition> ::= <Expression><RelationOperator><Expression>
<Expression> ::= <Item>{+<Item>|-<Item>}
<Item> ::= <Factor>{*<Factor>|/<Factor>}
<Factor> ::= ID|NUM|(<Expression>)
<RelationOperator> ::= <|<=|>=|>|==|!=



休息一下:

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