C语言基于EBNF语法的讲述

基于JavaCC的语法描述

运用JavaCC从token类别中分辨出”语句” “表达式” “函数调用”
等语法单位的艺术。

只要为JavaCC描述“语句” “表明式” “函数调用”
那样的语法单位各自是由什么的token系列构成的,就能够对该语法实行辨析(parse)。

譬如:最简便易行的赋值表明式能够描述为“符号” “ “=” ” ”表达式“ 的排列。
换言之, 如若存在”符号“ ” ”=“ “ ”表达式“ 那样的排列
这正是赋值表明式。这些规则在JavaCC中象征成上面这样:

assign():
{}
{
  <IDENTIFIER> "=" expr()
}

  assign()对应赋值表达式,<IDENTIFIEPRADO>对应token标示符,”=”对应”=”token。
像<IDENTIFIE奔驰G级>那样已经在扫描器中定义的token,在描述解析器时可以平素运用。其余的如”=”那样的固化字符串也因为能够象征token,所以也能在规则中选择。
其它,表明式expr()自个儿也是八个token构成的,那样的景况下须求更为对expr()的条条框框进行描述,以下是伪描述:

expr():
{}
{
     expr() "+" expr()
   或expr() "-" expr()
   或expr() "*" expr()
   ..
   .
}

极限符与非终端符

JavaCC中校”语句” “函数调用” “表明式”
等非token的语法单位称为非终端符,并将非终端符像java的函数调用壹样在前面加上括号写成stmt()或expr()。
顶点符能够综合为token。使用在扫描器中定义的名号,能够写成<INDENTIFIEMurano>或<LONG>。并且JavaCC中除去扫描器中定义的token以外,
“=”、”+”、”==” 那样的字符串字面量也足以当做终点符来使用

种类 含义
终端符 token <IDENTIFIER>、<LONG>、"="、"=="
非终端符 由终端符排列组成的语法单位 stmt()、expr()、assign()

在画语法时,终端符位于树的枝干的末端(终端),非终端符由于是由别的标志的列组成的,所以放在分叉处。

JavaCC的EBNF表示法

JavaCC使用EBNF(Extended
Backus-Naur-Form)的表示法来描述语法规则。下表中陈列了JavaCC的解析器生成所使用的EBNF表示法。

种类 例子
终端符 <IDENTIFIER>或","
非终端符 name()
连接 <UNISGNED><LONG>
重复0次或多次 (","expr())*
重复1次或多次 (stmt())+
选择 <CHAR>丨<SHORT>丨<INT>丨<LONG>
可以省略 [<ELSE>stmt()]

1. 连接

老是是指特定符号相连接的形式。例如C语言continue语句是保留字continue和分行的排列。JavaCC上将该规则写成如下格局:

<CONTINUE> ";"

<CONTINUE>是表示保留字continue的顶点符,“:”是表示字符本身的终端符。

2. 重复0次或频繁

上面包车型地铁写法表示0个或四个语句排列:

(stmt())*

下边包车型客车事例,函数的参数是由逗号分隔的表明式排列组合的,即expr之后排列着0个或多少个逗号和expr的组成:

expr() ("," expt())*

叁. 再一次二回或频仍

(stmt())+

地点的代码描述了非终端符stmt()重复叁次或频仍。

4. 选择

慎选即为从两个采纳中采用三个的条条框框。例如cflat的项目由void、char、unsigned、char等:

<VOID> | <CHAR> | <UNSIGNED> | <CHAR> | ...

伍. 足以总结

概念变量时方可设置开头值也足以不安装,这种在JavaCC中能够写成:

storage() typeref() name() ["=" expr()] ";"