EBNF的语法的代码表示

EBNF的代码表示的目的

计算产生式的first和follow集合,消除递归下降算法的回溯问题,提高分析性能。

假如文法如下

expression  : assign ;
assign  : equal | assign1 ;
assign1 : '=' equal assign1 | ε;  
equal  : rel equal1 ;
equal1  : ('==' | '!=') rel equal1 | ε ;
rel    : add rel1 ;
rel1  : ('>=' | '>' | '<=' | '<') add rel1 | ε ;
add    : mul add1 ;
add1  : ('+' | '-') mul add1 | ε ;
mul    : pri mul1 ;
mul1  : ('*' | '/') pri mul1 | ε ;
pri    : ID | INT_LITERAL | LPAREN expression RPAREN ; 

如何用代码表达产生式

  1. 终结符和非终结符号
  2. 产生式的左侧有不同产生式的表示(消除左递归、左递归)
  3. 非终结符逐层替换的如何表达

逐层递替换的特性表达

采用设计模式中的组合模式(composite pattern),即:终结符号和非终结符都继承同一个抽象的节点类型,
通过addchild的方式组合成一个树形的

一个非终结符有多个产生式进行替换如何进行表达

有名子节点: 如产生式assign : equal | assign1,表示assign可以被替换为equal或者assign1.equal和assign1是assgin的子节点,且两个子节点的关系是或者。通过给assign设置type表示子节点的关系。const assign = new Assign();assign.addChild( new equalNode() );assign.addChild( new assign1Node() )
**匿名子节点:**还比如过产生式为:add := mul + add | mul,add有两个子节点,分别为mul+add 和 mul。mul+add的名称为一个匿名的node节点

树中的节点如何表达

树中的每个节点都继承自Node节点,每个节点都没有差别
子节点放到父节点的数组中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值