基于EBNF语法的描述

基于JavaCC的语法描述

动JavaCC从token序列中分辨出”语词” “表达式” “函数调用”
等语法单位之措施。

一味设为JavaCC描述“语词” “表达式” “函数调用”
这样的语法单位分别是由于哪的token序列构成的,就会针对该语法进行解析(parse)。

比如说:最简便易行的赋值表达式可以描述为“符号” “ “=” ” ”表达式“ 的排。
换言之, 如果存在”符号“ ” ”=“ “ ”表达式“ 这样的排
那就算是赋值表达式。这个规则以JavaCC中代表成下面这样:

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

  assign()对应赋值表达式,<IDENTIFIER>对诺token标示符,”=”对应”=”token。
像<IDENTIFIER>这样既当扫描器中定义的token,在描述解析器时方可一直用。其他的如”=”这样的永恒字符串也为可以代表token,所以呢克以规则中使。
另外,表达式expr()自身为是差不多只token构成的,这样的情景下需要越来越对expr()的平整进行描述,以下是私自描述:

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

极限符与非终端符

JavaCC中将”语句” “函数调用” “表达式”
等非token的语法单位称为非终端符,并将非终端符像java的函数调用一样在后头长括号写成stmt()或expr()。
终极符可以归纳为token。使用在扫描器中定义之名目,可以写成<INDENTIFIER>或<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())*

3. 再次1不善或累

(stmt())+

点的代码描述了非终端符stmt()重复1次等还是累。

4. 选择

选就为于多个挑选中挑选1只之平整。例如cflat的项目由void、char、unsigned、char等:

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

5. 可简简单单

概念变量时得安装初始值也得无设置,这种以JavaCC中得形容成:

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