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

词法分析可识别内容:标识符:id数字:num关键字:int,char,if,else,while,do,for标号:, , . , ;算术运算符号:=,+,-,*,/,&,!,|,&&,||关系运算符:=,>,==,!=注释://内码定义:单个符号,如{,+,*,> 等,均使用其ascii码做内码,占双或多个字节的符号(包括保留字,标号,数字,运算符等)为其取...
摘要由CSDN通过智能技术生成

词法分析

可识别内容:

标识符: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; 则会出现如下错误提示,指示了出错行数和行内偏移位置:

规则如下:

::= '{''}'

::= {||}

::= ';'

::=

::= |

::= ID=

::= if(

::= while(

::=

::= {+|-}

::= {*|/}

::= ID|NUM|()

::= =|>|==|!=

//非终结符的英文定义

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语句。

词法分析:

37821835_1.gif//LexAly.cpp :C子集词法分析程序37821835_2.gif

37821835_3.gif/**//*37821835_4.gif  

37821835_4.gif支持内容:

37821835_4.gif标识符:id

37821835_4.gif关键字: int,char,if,else,while,do,for

37821835_4.gif标号: ,, .,  ;

37821835_4.gif算术运算符号: =,+,-,&,!,|,&&,||

37821835_4.gif

37821835_4.gif全局字符串:

37821835_4.gifinstr 记录待解析的字符串

37821835_4.gifstring 存贮当前被解析到的ID

37821835_4.gif

37821835_4.gif接口:

37821835_4.gifgettoken();

37821835_4.gif

37821835_4.gif

37821835_4.gif

37821835_4.gifSample:

37821835_4.gif输入:

37821835_4.gifinstr = 

37821835_4.giffor(i=0;i<10;i++){

37821835_4.gif    j=i+10;

37821835_4.gif    printf("%d",j);

37821835_4.gif}

37821835_4.gif输出:

37821835_4.giffor

37821835_4.gif(

37821835_4.gifi

37821835_4.gif……

37821835_4.gif}

37821835_4.gif

37821835_4.gif

37821835_4.gif注意:

37821835_4.gif要记得处理程序中未显示出来的符号,如空白(' '),回车(' '),值表符(' ')

37821835_5.gif*/37821835_1.gif

37821835_1.gif#include"stdafx.h"37821835_1.gif#include37821835_1.gif#include37821835_1.gif#include37821835_1.gif#include"Constant.h"37821835_1.gif

37821835_1.gifexternvoidgrammar_check();

37821835_1.gif

37821835_1.gif

37821835_1.gif//注意:这里累计数目(最大值)不能大于32 (10 0000B)TOKEN

37821835_1.gif//enum {END=0,INT=1,CHAR,IF,ELSE,WHILE,DO,FOR,ARGAND,ARGOR,NUM,ID} ;37821835_1.gif37821835_2.gif

37821835_3.gifcharindex[][20]=...{

37821835_6.gif

37821835_7.gif...{"END OF File"},/**//*0 END*/37821835_6.gif

37821835_7.gif...{"int"},/**//*1 INT*/37821835_6.gif

37821835_7.gif...{"char"},/**//*2 CHAR*/37821835_6.gif

37821835_7.gif...{"if"},/**//*3 IF*/37821835_6.gif

37821835_7.gif...{"else"},/**//*4 ELSE*/37821835_6.gif

37821835_7.gif...{"while"},/**//*5 WHILE*/37821835_6.gif

37821835_7.gif...{"do"},/**//*6 DO*/37821835_6.gif

37821835_7.gif...{"for"},/**//*7 FOR*/37821835_6.gif

37821835_7.gif...{"&&"},/**//*8 ARGAND*/37821835_6.gif

37821835_7.gif...{"||"},/**//*9 ARGOR*/37821835_6.gif

37821835_7.gif...{""},/**//*10 NUM*/37821835_6.gif

37821835_7.gif...{""},/**//*11 ID*/37821835_6.gif

37821835_7.gif...{"<="},/**//*12 LESSEQUAL*/37821835_6.gif

37821835_7.gif...{"=="},/**//*13 EQUAL*/37821835_6.gif

37821835_7.gif...{">="},/**//*14 GREATEQUAL*/37821835_6.gif

37821835_7.gif...{"!="},/**//*15 NOTEQUAL*/37821835_6.gif

37821835_7.gif...{""}/**//*16 ID*/37821835_5.gif};

37821835_1.gif

37821835_2.gif

37821835_3.gifcharinput[10000]=...{0};

37821835_1.gif

37821835_1.gifchar*instr=input;

37821835_1.gifchar*conststart_of_instr=input;

37821835_1.gif

37821835_1.gif//string 包含gettoken最新得到的id等串

37821835_1.gif//gym包含 gettoken得到的内容的代号

37821835_1.gif//current_line 包含当前行号37821835_1.gifcharstring[MAX_INDENT];

37821835_1.gifintsym;

37821835_1.gifintcurrent_line=1;

37821835_1.gifintstart_pos_of_current_line;

37821835_1.gif

37821835_1.gifchar*strstart;//用于辅助识别num,id37821835_1.gif37821835_1.gifintgettoken();

37821835_1.gifint_gettoken();

37821835_1.gif

37821835_1.gifvoiderror(char*cur);

37821835_1.gifchar*getlinestring(intline,char*in_buf);

37821835_1.gifintnextline();

37821835_1.gifintgetline();

37821835_1.gifintgetcurrentpos();

37821835_1.gif

37821835_1.gif

37821835_2.gif

37821835_3.gifintnextline()...{return++current_line; }37821835_2.gif

37821835_3.gifintgetline()...{returncurrent_line; }37821835_2.gif

37821835_3.gifintgetcurrentpos()...{return(int)instr; }37821835_1.gif

37821835_1.gifchar*getlinestring(intline,char*in_buf)

37821835_2.gif

37821835_3.gif...{

37821835_4.gifchar*t=input;

37821835_4.gifinti=1;

37821835_4.gif

37821835_6.gif

37821835_7.gifwhile(*t!=0&&i

37821835_4.gifif(*t=='') i++;

37821835_4.gif        t++;

37821835_8.gif    }37821835_4.gif

37821835_4.gifintlen=0;

37821835_6.gif

37821835_7.gifwhile(*t!='')...{

37821835_4.gif        in_buf[len]=*t;

37821835_4.gif        len++;

37821835_4.gif        t++;

37821835_8.gif    }37821835_4.gif    in_buf[len]=0;

37821835_4.gifreturnin_buf;

37821835_4.gif        

37821835_5.gif}37821835_1.gif

37821835_1.gifvoiderror(char*cur)

37821835_2.gif

37821835_3.gif...{

37821835_4.gif    printf("Spell Error found at line %d",getline());

37821835_4.gif    exit(0);

37821835_4.gif    

37821835_5.gif}37821835_1.gif

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值