武汉大学编译原理第三次作业

本文深入探讨了正则表达式解析器的内部实现机制,详细介绍了从输入字符串到AST(抽象语法树)构建的过程,包括词法分析、语法分析以及构建过程中的关键节点处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/************************************************************/
/*      copyright hanfei.wang@gmail.com                     */
/*             2013.03.20                                   */
/*             2013301500100 计科三班 秦贤康                */
/*             2013.03.20                                   */
/************************************************************/


#include <ctype.h>
#include <stdlib.h>
#include "ast.h"


/* reg -> term  reg'
   reg' -> '|' term reg' | epsilon
   term -> kleene term'
   term' -> kleene term' | epsilon
   kleene -> fac kleene' 
   kleene' -> * kleene' | epsilon
   fac -> alpha | '(' reg ')'
   
   2013301500100
*/
static char input_buffer[MAX_STATES] = "\0";


FOLLOW_INDEX cindex[MAX_STATES] = {0}; 
/*  pos index to the corresponding character and 
    follow set */


static char * current = input_buffer;


static int pos = 0;


  
void next_token(void)
{
  if ( !*current ) {
    current = input_buffer;
    if ( !fgets(input_buffer, MAX_STATES - 1, stdin) ) {
      *current = '\0';
      return;
    }
  } else current ++;


  while ( isspace (*current) ) 
    current ++;
  //  printf("current char is %c\n", *current);
 }


AST_PTR reg();
AST_PTR reg1(AST_PTR term_left);
AST_PTR term ();
AST_PTR term1(AST_PTR kleene_left);
AST_PTR kleene();
AST_PTR kleene1( AST_PTR fac_left);
AST_PTR fac();




AST_PTR start()
{
  AST_PTR leaf, root = reg ();
  pos ++;
  leaf = mkLeaf('$', pos);
  root = mkOpNode(Seq, root, leaf);


  if ( *current != '\0' ) 
    printf("the parser finished at %c, before the end of RE\n", *current);
  return root;
}


//学生自己完成以下部分


/* reg -> term  reg' */ 
AST_PTR reg()
{
  return reg(term());
}


/*  reg' -> '|' term reg' | epsilon */
AST_PTR reg1(AST_PTR term_left)
{
	AST_PTR temp=term_left;
    if(*current=='!'){
		temp=mkOpNode(Or,term_left,mkEpsilon());
		next_token();
    }
	if(*current=='|'){
		next_token();
		temp=reg1(mkOpNode(Or,term_left,term()));
	}
  return temp;
}


/*  term -> kleene term' */
AST_PTR term ()
{
  return term1(kleene());
}


/*  term' -> kleene term' | epsilon */
AST_PTR term1(AST_PTR kleene_left)
{
	AST_PTR temp=kleene_left,temp1;
	if(*current=='\0')return kleene_left; 
    if(*current=='!'){
		 temp=mkOpNode(Seq,kleene_left,mkEpsilon());
		 next_token();
    }else {
		temp1=kleene();
		if(temp1){
			temp1=mkOpNode(Seq,kleene_left,temp1);
			temp=term1(temp1);
		}
	}
	return temp;
}




/*  kleene -> fac kleene' */
AST_PTR kleene()
{
	return kleene1(fac());
}


/*   kleene' -> * kleene' | epsilon */
AST_PTR kleene1( AST_PTR fac_left)
{
	AST_PTR temp=fac_left;
	if(*current=='!'){
		temp=mkOpNode(Seq,fac_left,mkEpsilon());
		next_token();
	}else if(*current=='*'&&fac_left != NULL){
		next_token();
		temp=kleene1(mkOpNode(Star,fac_left,NULL));
	}
	return temp;
}


/*   fac -> alpha | '(' reg ')' */
AST_PTR fac()
{ 
	AST_PTR temp=NULL;
	if(*current=='('){
		next_token();
		temp=reg();
	}
	if(*current==')'){
		next_token();
		return NULL;
	}
	if(*current=='!')return mkEpsilon();
	else if(*current!='*'&&*current!='|'){ 
		temp=mkLeaf(*current,pos++);
		next_token();
	} 
	return temp;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值