基于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()] ";"

基于EBNF语法的描述的更多相关文章

  1. 基于HOG-3D的时空描述子

    作者提出一种新的基于局部描述子的行为识别算法.

  2. Flink 的Window 操作(基于flink 1.3描述)

    Window是无限数据流处理的核心,Window将一个无限的stream拆分成有限大小的”buckets”桶,我们可以在这些桶上做计算操作.本文主要聚焦于在Flink中如何进行窗口操作,以及程序员如何 ...

  3. 网站实现微信登录之回调函数中登录逻辑的处理--基于yii2开发的描述

    上一篇文章网站实现微信登录之嵌入二维码中描述了如何在自己的登录页面内嵌入登录二维码,今天的这篇文章主要是描述下在扫码成功之后微信重定向回网站后登录逻辑的处理,其实也就是验证身份信息,授权用户登录的逻辑 ...

  4. 网站实现微信登录之嵌入二维码——基于yii2开发的描述

    之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...

  5. 【转】微信小程序原理

    微信小程序原理 kamidox 关注 2016.11.05 09:42* 字数 2356 阅读 14621评论 5喜欢 75赞赏 1 微信小程序使用了前端技术栈 JavaScript/WXML/WXS ...

  6. 用25行JavaScript语句实现一个简单的编译器

    原文:https://www.iteye.com/news/32680 译者注:即使对于专业程序员来说,构造一个编译器也是颇具挑战性的任务,本文将会引导你抽丝剥茧,一探究竟! 我已经写了几篇与编程语言 ...

  7. xmake 描述语法和作用域详解

    xmake的工程描述文件xmake.lua虽然基于lua语法,但是为了使得更加方便简洁得编写项目构建逻辑,xmake对其进行了一层封装,使得编写xmake.lua不会像些makefile那样繁琐 基本 ...

  8. 基于语法分析器GOLD Parser开发的数学表达式计算器

    最近发现一款文法分析神器,看完官网(http://goldparser.org/)的介绍后感觉很犀利的样子,于是就拿来测试了一番,写了一个数学表达式分析的小程序,支持的数学运算符如下所示:常规运算:+ ...

  9. ANTLR4权威指南 - 第5章 设计语法

    在第I部分,我们熟悉了ANTLR,并在一个比较高的层次上了解了语法以及语言程序.现在,我们将要放慢速度来学习下实现更实用任务的一些细节上的技巧,例如建立内部数据结构,提取信息,生成输入对应的翻译内容等 ...

随机推荐

  1. PAT Basic 1026

    1026 程序运行时间 (15 分) 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗 ...

  2. Python常用的软件包

    下面是Python开发常用的软件包. 名称 用途 安装命令 opengl   sudo pip3 install PyOpenGL  pyqtgraph GUI图形库 sudo pip3 instal ...

  3. Java+Selenium3框架设计篇5-如何实现邮件发送测试报告

    https://blog.csdn.net/u011541946/article/details/77278837 本篇继续回答网友的问题,这个主题是如何通过邮件发送测试报告.通过邮件发送测试报告,这 ...

  4. 《分布式任务调度平台XXL-JOB》

    一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并接入多家公司线上产品线,开箱即用. 1.2 特性 1.简单:支 ...

  5. yarn upgrade

    更新一个依赖 yarn upgrade 用于更新包到基于规范范围的最新版本 yarn upgrade --latest # 忽略版本规则,升级到最新版本,并且更新 package.json .

  6. Xcode9.2打包图片显示异常解决方案

    链接:https://www.jianshu.com/p/ca0bbb403143來源:简书 在使用Xcode9.2适配iPhone X的过程中遇到了部分图片显示异常(不显示或花掉)的问题.主要分两种 ...

  7. Easyui中 messager.alert 后某文本框获得焦点

    messager.alert 后某文本框获得焦点 $.messager.alert({ title:'消息', msg:'电话号码 只能是数字!', icon: 'info', width: 300, ...

  8. VMware下centOS yum报错cannot find a valid baseurl or repo:base 解决方法

    *无法联网的明显表现会有: 1.yum install出现 Error: cannot find a valid baseurl or repo:base 2.ping host会提示unknown ...

  9. Linux系统中的常用命令

    查看日志 cat 或 tail -f 日志文件说明 /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全 ...

  10. 安装sqlserver后 服务启动过几秒就自动停止

    今天安装sqlserver2014后 发现启动2014的服务,过几秒就会自动停止 通过查看windows日志发现是系统库路径报错~ google了下 发现 "重新生成系统库"就能解 ...