解释器构造文法简述

本文介绍了一种基于CMM文法的解析方法,详细阐述了语法结构及其在函数调用、逻辑运算等方面的应用,并提供了自顶向下分析的具体实现。

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

本文法是在CMM文法的基础上做了函数调用,逻辑运算以及数组运算,以及struct的定义,类的定义

首先说明一下树节点所应该包含的信息,分别包含了:
节点的类型,当前token的所有信息,int值,real值,数组维数,最重要的是孩子节点指针,这里用一个链表表示所有的孩子。你也可以加上行号,以及其他的信息。


入口是start_STMT.从这个根节点下,它的孩子是class定义的节点和struct定义的节点。(^ is null)
START_STMT------->CLASS_STMT | STRUCT_STMT
CLASS_STMT------->class { CLASS_BODY_SEQ }
CLASS_BODY_SEQ------->CLASS_BODY_SEQ CLASS_BODY_STMT | ^
CLASS_BODY_STMT------->FUNC_STMT | DEC_STMT


STRUCT_STMT------->struct { STRUCT_BODY }
STRUCT_BODY------->STRUCT_BODY DEC_STMT | DEC_STMT


FUNC_STMT------->FUNC_TYPE ID ( PARA_STMT_SEQ ) { STMT_SEQ }
FUNC_TYPE------->void | int | real | bool
ID------->[a-zA-Z$_]+(a-zA-Z$_0-9)*
PARA_STMT_SEQ------->PARA_STMT_SEQ [,PARA_DEC] | PARA_DEC
PARA_DEC------->TYPE DIMEN_DESC ID
TYPE------->int | real | bool
DIMEN_DESC------->DIMEN_DESC [] | []


STMT_SEQ------->{ STMT_SEQ_BODY }
STMT_SEQ_BODY------->STMT_SEQ_BODY | STMT
STMT------->DEC_STMT | IF_STMT | WHILE_STMT | READ_STMT | WRITE_STMT | RETURN_STMT | CALL_STMT | ASSIGN_STMT | SELF_STMT


DEC_STMT------->TYPE ID DEC_STMT_SUB;
DEC_STMT_SUB------->[=EXP] | DIMEN_SEQ
DIMEN_SEQ------->DIMEN_SEQ[AEXP] | [AEXP]


IF_STMT------->IF( EXP ) STMT_PART [ELSE STMT_PART];
STMT_PART------->STMT | STMT_SEQ


WHILE_STMT------->WHILE (EXP) STMT_SEQ;


READ_STMT------->READ ID [DIMEN_SEQ];


WRITE_STMT------->WRITE EXP;


RETURN_STMT------->RETURN EXP;


CALL_STMT------->ID ( PARA_CALL_SEQ );
PARA_CALL_SEQ------->PARA_CALL_SEQ [,EXP] | EXP


ASSIGN_STMT------->ID [DIMEN_SEQ] = EXP;


SELF_STMT------->SELFOP ID[DIMEN_SEQ] | ID[DIMEN_SEQ] SELFOP;
SELFOP------->++ | --


EXP------->OR
OR------->AND[|| OR]
AND------->NOT [|| AND]
NOT------->^NOT | EQEXP | CONSTBOOL
EQEXP------->AEXP EOP AEXP
EOP------->< | <= | > | >= | == | !=
AEXP------->TEXP AOP TEXP
AOP------->+ | -
TEXP------->UNAEXP TOP UNAEXP
TOP------->* | / | %
UNAEXP------->[POP] ELEMENT | ELEMENT [SELFOP]
POP------->SELFOP | -
ELEMENT------->CONST | ID2 | ( EXP )

ID2------->ID [DIMEN_SEQ] | ID (PARA_CALL_SEQ)


以上便是涉及到的所有文法。实现采用自顶向下分析方法。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值