介绍

这篇文章讨论了在不从要分析的文本中删除空格的情况下创建Antlr语法的困难和解决方案。 但首先,简要解释一下Antlr的真正含义。

这是链接https://github.com/antlr/antlr4 。 Antlr可以采用规则明确的文本,并从中创建语法树。 基本上这就是它的优点。 用户必须创建DSL(特定于域的语言)的语法并将其提供给工具。 该工具生成解析器代码。 它可以是Java代码或Javascript代码。 Antlr具有不少于5个目标(支持的语言)。 生成的解析器代码可以解析文本并创建抽象语法树。 然后,用户可以使用生成的访问者(这是众所周知的访问者模式)来遍历AST,以从中获取某些东西。

问题

大多数Antlr语法都像这样删除词法分析器中的空白:

WS
:[\ r \ n \ t] +->跳过
;

这肯定会使解析过程变得容易一些,因为它可以转换此表达式:
q1 + q2 / f2 –(4 + 5) 变成一个更简单的形式: q1 + q2 / f2-(4 + 5) 没有这些空格,编写Antlr语法的规则就容易得多。 但是在某些情况下,不可能删除所有空格,因为它们可能是变量名的一部分。 在这种情况下,我正在处理单引号这样的变量:“变量1”。 空格是变量名的一部分。 语法必须考虑到空格可以是变量名的一部分,但也可以是用户为了可读性而输入的“无用”字符,例如逗号后的空格。 需要特殊的空格处理才能解析此表达式:

'变量ABC'* 5 +'变量Q'*(1 +'变量W')

这个想法是这样的:如果我们不能从文本中删除空格,我们必须将空格“拉”入括号,运算符等。

运算符和括号的规则必须更改以插入空格。 首先,我们需要声明空格的标记:

ANY_SPACE:SINGLE_SPACE +;

SINGLE_SPACE:“”;

我们不能使用SINGLE_SPACE *,因为Antlr工具正确显示SINGLE_SPACE *可以匹配一个空字符串。

然后将这些标记合并到运算符规则中(MUL为'*'和Div为'/',rParameterSeparator用于分隔函数实际参数的逗号
):

rLeftVarParenthesis:L_VAR_PAREN ANY_SPACE | L_VAR_PAREN;

rArithmeticOperatorMulDiv:ANY_SPACE(MUL | DIV)ANY_SPACE | ANY_SPACE(MUL | DIV)| (MUL | DIV)ANY_SPACE | (MUL | DIV);

rParameterSeparator:ANY_SPACE','ANY_SPACE | ANY_SPACE','| ','ANY_SPACE | ',';

现在,该语法可以处理名称中带有空格的变量。 访问者在访问操作员规则时可以加入子级中的文本,并使用修剪删除所有不必要的空间。 用Javascript可能看起来像这样:

返回ctx.children.join(”)。trim();

这个简单而优雅的解决方案允许使用空格来解析变量名。

翻译自: https://www.javacodegeeks.com/2019/11/antlr-4-grammar-with-spaces.html

Antlr 4语法与空格相关推荐

  1. Python语法对空格的严格要求

    Python语法对空格的严格要求 要求1 python与Java不同,python使用的是4个空格表示一个缩进,用缩进来控制代码块,而不是{}. 要求2 python的同一个代码块必须用相同缩进(相同 ...

  2. JAVA文法bnf_关于java:BNF命题逻辑ANTLR的语法

    我正在尝试在Antlr中为命题逻辑创建BNF语法,但我不断收到错误消息: java.lang.NoSuchFieldError:offendingToken 由于没有显示行号,所以我不知道错误在哪里. ...

  3. 【Antlr】Antlr 孤岛语法:处理相同文件中的不同格式

    1.概述 ANTLR有三个与词法符号有关非常棒的特性,值得付诸笔墨.首先,我们将会尝试处理XML .这样的具有不同词法结构的输入格式 (标签内外不同).其次,我们将会学习通过修改输入的词法符号流,在J ...

  4. 【Antlr】Antlr 在语法中嵌入任意动作

    1.概述 参考Antlr4 权威指南 4.4 章节 g4 文件如下 grammar Rows;@parser::members { // add members to generated RowsPa ...

  5. hibernate中antlr对于hql生成抽象语法树源码解析

    Hibernate版本5.1.11FInal 以一句update语句作为例子. update com.tydhot.eninty.User set userName=:userName where u ...

  6. 语法解析及Antlr

    目录 1 语法解析 1.1 语法解析器 1.1.1 执行流程 1.1.2  语法树好处 1.1.3 解析方法LL与LR 1.1.4 抽象语法树(AST) 1.2  语法规则文件 2 Antlr 2.1 ...

  7. ANTLR笔记2 - 简单语法说明

    ANTLR的语法文件使用扩展巴科斯范式EBNF描述,记得编译原理的用起来非常简单,需要进一步了解的是怎么构造自己的recognizer和translator.很多的语法不需要从头写,一方面很多语言标准 ...

  8. 开源语法分析器--ANTLR

    开源语法分析器--ANTLR 序言 有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间.比方学完操作系统原理之后我们并不能自己动手实现一个操作系统:学完数据库原理我们也不能弄出个像样 ...

  9. 有道云 语法高亮_antlr语法增强使用

    看这篇之前,对antlr没有了解的可以自行百度. 用过antlr语法解析的都会遇到需要写listener和 visitor的时候,看我之前写过的这篇 松仁普:antlr解析语法树的使用​zhuanla ...

最新文章

  1. 强制类型转换规则 java_Java学习——第002天学习笔记整理
  2. springboot集成themeleaf报Namespace 'th' is not bound
  3. pyperclip模块
  4. SAP UI5 jQuery.sap.formatMessage
  5. ThinkPHP 发送post请求
  6. JavaScript将iframe中控件的值传到主页面控件中
  7. ELK下logstash通过redis收集日志
  8. IP修改后自动还原(IP地址无法修改)
  9. 计算机文化书签,《计算机文化基础》EXCEL-机试[1]
  10. windows10自带我的文档等路径修改
  11. iOS:开放平台引用(二)--微信分享
  12. 【教育教学资源】教育资讯、教学功能、当老师、或者补习班给学生的资料
  13. 网站建设视频教程,史上最精,最全。
  14. 快速开发一个h5游戏
  15. 云计算技术基础【2】
  16. JavaEE 项目常见错误汇总
  17. ubuntu 运行QQ轻聊版7.9
  18. 当再多大公司慢慢的放弃微软的技术时, 不知大家怎想?
  19. 程序员述说阿里HR的恐怖:晚上11点接到面试电话
  20. 【转载】Selenium使用Page Object实现页面自动测试

热门文章

  1. element 远程搜索讲解
  2. Python教程——字典
  3. html导航怎么加图标,纯 CSS 实现导航图标动画
  4. Ftrace分析cpu idle被周期唤醒原因
  5. 用计算机弹出娃娃脸,在windows xp中释放隐藏网速
  6. hive内嵌时间日期函数:所有关于时间日期的函数
  7. 【终端显示】nodemon : 无法加载文件 C:\Users\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运 行脚本。有关详细信息,请参阅 https:/go.
  8. LTE----003 eNodeB
  9. 阿里卖家 Flutter for Web 工程实践
  10. 无人值守安装Linux系统