JavaCC的语法描述

本文详细介绍了如何使用JavaCC进行语法描述,包括终端符和非终端符的概念,EBNF表示法,处理语法二义性和JavaCC的局限性。通过提取共通部分和使用token的超前扫描解决冲突问题,解析器的构建更加灵活。
摘要由CSDN通过智能技术生成
基于JavaCC的语法描述

只要为JavaCC描述"语句"、“表达式”、“函数调用” 这样的语法单位各自是由怎样的token序列构成的,就能够对该语法进行分析。

例如,最简单的赋值表达式可以描述为 "符号" = "表达式" 的排列。换言之,如果存在 "符号" = "表达式" 表达式这样的排列,那就是赋值表达式。

这个规则在 JavaCC 中表示成下面这样

assign():						//定义赋值表达式,名字任取
{}
{
 <IDENTIFIER> "=" expr()		//<IDENTIFIER> 对应 token 标识符,"=" 对应 "=" token,expr() 对应表达式,名字可以任取
}

expr():							//表达式 expr() 自身也是由多个 token 构成的,这样的情况下需要进一步对 expr() 的规则进行描述
{}
{    expr() "+" expr()
  或 expr() "-" expr()
  或 expr() "*" expr()
  ......
}

像这样写好所有语法单位的规则之后,基于 JavaCC 的解析器的描述也就完成了。

终端符和非终端符

JavaCC 中将刚才的“语句”、“函数调用”、“表达式” 等非 token 的语法单位称为非终端符。

JavaCC 中除了扫描器中定义的 token 以外,"="、"+"、"==" 这样的字符串字面量也可以作为终端符来使用。

种类 含义
终端符 token 、、"="、"=="
非终端符 由终端符排列组成的语法单位 stmt()、expr()、assign()
JavaCC 的 EBNF 表示法

JavaCC使用EBNF(Extended Backus-Naur-Form)的表示法来描述语法规则

种类 例子
终端符 或","
非终端符 name()
连接
重复0次或多次 (","expr())*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值