一个简单的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 {
11 X
61 =
10 12
43 +
43 +
11 b
47 /
10 13
45 -
10 5
42 *
10 4
42 *
10 9 
59 ;
11 Y
61 =
10 4
42 *
10 1024
59 ;
3 if
40 (
11 X
14 >=
11 Y
41 )
123 {
3 if 40 (
11 i
13 ==
11 i
41 )
123 {
11 X
61 =
11 Y
125 }
125 }
59 ;
59 ;
59 ;
59 ;
 5 while
40 (
11 X
60 <
11 Y
41 )
123 {
11 X
61 =
11 X
43 +
10 1
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 
void grammar_check();
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
// 注意:这里累计数目(最大值)不能大于32 (10 0000B)TOKEN
一个简单的C语言词法分析与语法分析器
//enum {END=0,INT=1,CHAR,IF,ELSE,WHILE,DO,FOR,ARGAND,ARGOR,NUM,ID} ;
一个简单的C语言词法分析与语法分析器

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

一个简单的C语言词法分析与语法分析器
int gettoken();
一个简单的C语言词法分析与语法分析器
int _gettoken();
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
void error(char *cur);
一个简单的C语言词法分析与语法分析器
char* getlinestring(int line,char *in_buf);
一个简单的C语言词法分析与语法分析器
int nextline();
一个简单的C语言词法分析与语法分析器
int getline();
一个简单的C语言词法分析与语法分析器
int getcurrentpos();
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
int nextline() ...{    return ++current_line; }
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
int getline() ...{    return current_line; }
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
int getcurrentpos() ...return (int)instr; }
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
char* getlinestring(int line,char *in_buf)
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    
char * t = input;
一个简单的C语言词法分析与语法分析器    
int i = 1;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
while(*!= 0 &&  i < line )...{
一个简单的C语言词法分析与语法分析器        
if*t==' ' ) i++;
一个简单的C语言词法分析与语法分析器        t
++;
一个简单的C语言词法分析与语法分析器    }

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

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

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
void error(char *cur)
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    printf(
"Spell Error found at line %d  ",getline());
一个简单的C语言词法分析与语法分析器    exit(
0);
一个简单的C语言词法分析与语法分析器    
一个简单的C语言词法分析与语法分析器}

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
//语法分析
一个简单的C语言词法分析与语法分析器
int main_grammar(char *filename)
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    
int i;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    FILE 
*f;
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
if(!(f=fopen(filename,"r")))...{
一个简单的C语言词法分析与语法分析器        printf(
"Fail to open source file %s! ",filename);
一个简单的C语言词法分析与语法分析器        exit(
0);
一个简单的C语言词法分析与语法分析器    }

一个简单的C语言词法分析与语法分析器    
int k=0;
一个简单的C语言词法分析与语法分析器    
char c;
一个简单的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语言词法分析与语法分析器    
return 0;
一个简单的C语言词法分析与语法分析器}

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
// 词法分析
一个简单的C语言词法分析与语法分析器
int main_spell(char *filename)
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    
int i;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    FILE 
*f;
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
if(!(f=fopen(filename,"r")))...{
一个简单的C语言词法分析与语法分析器        printf(
"Fail to open source file %s! ",filename);
一个简单的C语言词法分析与语法分析器        exit(
0);
一个简单的C语言词法分析与语法分析器    }

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    
int k=0;
一个简单的C语言词法分析与语法分析器    
char c;
一个简单的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语言词法分析与语法分析器    
return 0;
一个简单的C语言词法分析与语法分析器}

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
int gettoken()
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    
int i= (sym = _gettoken());
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器#
if 0
一个简单的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语言词法分析与语法分析器    
return sym;
一个简单的C语言词法分析与语法分析器}

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
int _gettoken()
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    
char *cp = instr;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
for(;;)...{
一个简单的C语言词法分析与语法分析器        
if*instr == 0)
一个简单的C语言词法分析与语法分析器            
return END;
一个简单的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;return IF; 
一个简单的C语言词法分析与语法分析器            }

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

一个简单的C语言词法分析与语法分析器            
// not a keyword. but an id.
一个简单的C语言词法分析与语法分析器
            strstart = instr;
一个简单的C语言词法分析与语法分析器            instr
++;
一个简单的C语言词法分析与语法分析器            
goto id_label;
一个简单的C语言词法分析与语法分析器        
case 'c':
一个简单的C语言词法分析与语法分析器            
if( instr[1== 'h' && instr[2== 'a' && instr[3== 'r' && notda(instr[4]) )
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
...{instr+=4;return CHAR; }
一个简单的C语言词法分析与语法分析器            strstart 
= instr;
一个简单的C语言词法分析与语法分析器            instr
++;
一个简单的C语言词法分析与语法分析器            
goto id_label;
一个简单的C语言词法分析与语法分析器            
break;
一个简单的C语言词法分析与语法分析器        
case 'e':
一个简单的C语言词法分析与语法分析器            
if( instr[1== 'l' && instr[2== 's' && instr[3== 'e' && notda(instr[4]) )
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
...{instr+=4;return ELSE; }
一个简单的C语言词法分析与语法分析器            strstart 
= instr;
一个简单的C语言词法分析与语法分析器            instr
++;
一个简单的C语言词法分析与语法分析器            
goto id_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;return WHILE; }
一个简单的C语言词法分析与语法分析器            strstart 
= instr;
一个简单的C语言词法分析与语法分析器            instr
++;
一个简单的C语言词法分析与语法分析器            
goto id_label;
一个简单的C语言词法分析与语法分析器        
case 'd':
一个简单的C语言词法分析与语法分析器            
if( instr[1== 'o' && notda(instr[4]) )
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
...{instr+=2;return DO; }
一个简单的C语言词法分析与语法分析器            strstart 
= instr;
一个简单的C语言词法分析与语法分析器            instr
++;
一个简单的C语言词法分析与语法分析器            
goto id_label;
一个简单的C语言词法分析与语法分析器        
case 'f':
一个简单的C语言词法分析与语法分析器            
if( instr[1== 'o' && instr[2== 'r' && notda(instr[3]) )
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
...{instr+=3;return FOR; }
一个简单的C语言词法分析与语法分析器            strstart 
= instr;
一个简单的C语言词法分析与语法分析器            instr
++;
一个简单的C语言词法分析与语法分析器            
goto id_label;
一个简单的C语言词法分析与语法分析器
// deal with IDs.
一个简单的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语言词法分析与语法分析器            
goto id_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语言词法分析与语法分析器            
goto num_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+=2return EQUAL; }
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
else ...{instr++return '=';}
一个简单的C语言词法分析与语法分析器            
break;
一个简单的C语言词法分析与语法分析器        
case '<':
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
if( instr[1== '='...{instr+=2return LESSEQUAL; }
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
else ...{instr++return '<';}
一个简单的C语言词法分析与语法分析器            
break;
一个简单的C语言词法分析与语法分析器        
case '>':
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
if( instr[1== '='...{instr+=2return GREATEQUAL; }
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
else ...{instr++return '>';}
一个简单的C语言词法分析与语法分析器            
break;
一个简单的C语言词法分析与语法分析器        
case '!':
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
if( instr[1== '='...{instr+=2return NOTEQUAL; }
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
else ...{instr++return '!';}
一个简单的C语言词法分析与语法分析器            
break;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器        
case '&':
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器            
if( instr[1== '&'...{instr+=2return ARGAND; }
一个简单的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+=2return ARGAND; }
一个简单的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("new line (%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语言词法分析与语法分析器        
return ID;    
一个简单的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语言词法分析与语法分析器        
return NUM;    
一个简单的C语言词法分析与语法分析器        }

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

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
int main(int argc, 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语言词法分析与语法分析器    }
else if(argc == 2)...{
一个简单的C语言词法分析与语法分析器        argv[
1][0== 'g'? main_grammar("source2.txt") : main_spell("source2.txt");
一个简单的C语言词法分析与语法分析器        ;    
一个简单的C语言词法分析与语法分析器    }

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

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

 

 


 

 

一个简单的C语言词法分析与语法分析器// grammar.cpp :C子集语法分析程序
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
/**//*
一个简单的C语言词法分析与语法分析器C语言子集,可支持
一个简单的C语言词法分析与语法分析器语句块,语句,条件语句,While循环语句,赋值语句,基本算术表达式等。例如:
一个简单的C语言词法分析与语法分析器{
一个简单的C语言词法分析与语法分析器     // Comment Supported : This is only a Test ^_^
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    X = 12 + b / 13 - 5 * 4 * 9;    // A AssignmentStatement
一个简单的C语言词法分析与语法分析器    Y = 4 * 1024;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    if( X >= Y){
一个简单的C语言词法分析与语法分析器        if( i == i){            // This is nested if Statement
一个简单的C语言词法分析与语法分析器            X=Y;    
一个简单的C语言词法分析与语法分析器        }
一个简单的C语言词法分析与语法分析器    }
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    ;;;;                        // This is Null Statement
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    while( X < Y){            // This is while Statement
一个简单的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 
int gettoken();
一个简单的C语言词法分析与语法分析器extern 
int getcurrentpos();
一个简单的C语言词法分析与语法分析器extern 
char *string;
一个简单的C语言词法分析与语法分析器extern 
int  sym;
一个简单的C语言词法分析与语法分析器extern 
int  current_line;
一个简单的C语言词法分析与语法分析器extern 
int  start_pos_of_current_line;
一个简单的C语言词法分析与语法分析器extern 
char* getlinestring(int line,char *in_buf);
一个简单的C语言词法分析与语法分析器extern 
char input[];
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
//非终结符的英文定义
一个简单的C语言词法分析与语法分析器

一个简单的C语言词法分析与语法分析器
void StatementBlock();        //语句块
一个简单的C语言词法分析与语法分析器
void StatementSequence();    //语句串
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
// XxxxxStatement() 为三类语句
一个简单的C语言词法分析与语法分析器
void NullStatement();        //空语句--仅仅含有一个;号
一个简单的C语言词法分析与语法分析器
void CommonStatement();        //语句
一个简单的C语言词法分析与语法分析器
void VariantStatement();    //变种语句--包括 if(){},while{},他们都不以;结尾
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
// 下面的属于CommonStatement
一个简单的C语言词法分析与语法分析器
void AssignmentStatement();    //赋值语句
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
// 下面两种属于VariantStatement
一个简单的C语言词法分析与语法分析器
void ConditionStatement();    //条件语句
一个简单的C语言词法分析与语法分析器
void LoopWhileStatement();    //while循环语句
一个简单的C语言词法分析与语法分析器

一个简单的C语言词法分析与语法分析器
void Condition();            //条件
一个简单的C语言词法分析与语法分析器
void Expression();            //表达式
一个简单的C语言词法分析与语法分析器
void Item();                //
一个简单的C语言词法分析与语法分析器
void Factor();                //因子
一个简单的C语言词法分析与语法分析器
void RelationOperator();    //关系运算符
一个简单的C语言词法分析与语法分析器

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

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
void match_error(char * c)
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器    
char error_buf[1024];
一个简单的C语言词法分析与语法分析器    
int in_line_pos = getcurrentpos()-start_pos_of_current_line;
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    printf(
"Grammar Error! ");
一个简单的C语言词法分析与语法分析器    printf(
"Line %d[%d] :  %s expected ",current_line,in_line_pos,c);
一个简单的C语言词法分析与语法分析器    
一个简单的C语言词法分析与语法分析器    
//获取错误行并打印出来
一个简单的C语言词法分析与语法分析器
    getlinestring(current_line,error_buf);
一个简单的C语言词法分析与语法分析器    printf(
"%s ",error_buf);
一个简单的C语言词法分析与语法分析器    
//输出错误指示点(Not Exact!)
一个简单的C语言词法分析与语法分析器
    for(int i=1; i< in_line_pos; i++)
一个简单的C语言词法分析与语法分析器        printf(
"%c",'^');
一个简单的C语言词法分析与语法分析器    printf(
" ");
一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器    exit(
0);
一个简单的C语言词法分析与语法分析器}

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

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

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

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

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

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
void StatementSequence()    //语句串
一个简单的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语言词法分析与语法分析器
void VariantStatement()    //变种语句--包括 if(){},while{},他们都不以;结尾
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
switch(sym)...{    //若sym与下面两种均不匹配,什么也不做,空语句是也~
一个简单的C语言词法分析与语法分析器
    case IF:
一个简单的C语言词法分析与语法分析器        ConditionStatement();    
//条件语句
一个简单的C语言词法分析与语法分析器
        break;
一个简单的C语言词法分析与语法分析器    
case WHILE:
一个简单的C语言词法分析与语法分析器        LoopWhileStatement();
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    }

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

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

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

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

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

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

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

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

一个简单的C语言词法分析与语法分析器
一个简单的C语言词法分析与语法分析器
// <Expression> ::= <Item>{+<Item>|-<Item>}
一个简单的C语言词法分析与语法分析器
void Expression()            //表达式
一个简单的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语言词法分析与语法分析器
void Item()                //
一个简单的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语言词法分析与语法分析器
void Factor()                //因子
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
switch(sym)...{
一个简单的C语言词法分析与语法分析器    
case ID:
一个简单的C语言词法分析与语法分析器        match(ID,
"ID");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case NUM:
一个简单的C语言词法分析与语法分析器        match(NUM,
"NUM");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case '(':
一个简单的C语言词法分析与语法分析器        match(
'(',"(");
一个简单的C语言词法分析与语法分析器        Expression();
一个简单的C语言词法分析与语法分析器        match(
')',")");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
default:
一个简单的C语言词法分析与语法分析器        match(ID,
"A factor ");    // ID在这里肯定不match,利用它来报错(找不到因子)
一个简单的C语言词法分析与语法分析器
        break;
一个简单的C语言词法分析与语法分析器    }

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

一个简单的C语言词法分析与语法分析器
// <RelationOperator> ::= <|<=|>=|>|==|!=
一个简单的C语言词法分析与语法分析器
void RelationOperator()    //关系运算符
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器
...{
一个简单的C语言词法分析与语法分析器一个简单的C语言词法分析与语法分析器    
switch(sym)...{
一个简单的C语言词法分析与语法分析器    
case '<':
一个简单的C语言词法分析与语法分析器        match(
'<',"<");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case '>':
一个简单的C语言词法分析与语法分析器        match(
'>',">");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case LESSEQUAL:
一个简单的C语言词法分析与语法分析器        match(LESSEQUAL,
"<=");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case GREATEQUAL:
一个简单的C语言词法分析与语法分析器        match(GREATEQUAL,
">=");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case EQUAL:
一个简单的C语言词法分析与语法分析器        match(EQUAL,
"==");
一个简单的C语言词法分析与语法分析器        
break;
一个简单的C语言词法分析与语法分析器    
case NOTEQUAL:
一个简单的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> ::= <|<=|>=|>|==|!=

上一篇:真实的ECS使用体验


下一篇:面试官问我什么是JMM