ANTLR
ANTLR是一款清大的语法分析器生成工具。本专栏依据图书《ANTLR4 权威指南》进行Python语言实现的分享
杀毒的炼金术士
吾生也有涯 而知也无涯
展开
-
Antlr4 区分“减号”运算符和负号
在语法规则上区分减号和负号原创 2022-12-01 17:29:03 · 7194 阅读 · 1 评论 -
Antlr4 语法存在错误但语法分析器不报错的问题
最近使用Antlr4时,遇到了编写的,只是将报错位置及之后的全部token丢弃的情况。在此对案例进行分享,并分享一下我的解决方案。原创 2022-09-28 17:02:51 · 7002 阅读 · 0 评论 -
(Antlr4 4-2)利用监听器构建一个翻译程序(Python语言实现)
本节实现将Java类中的全部方法抽取出来,生成一个接口文件,使用监听器的方式。访问器与监听器的最大区别在于:监听器的方法会被ANTLR提供的遍历器对象自动调用而访问器中,必须显示的调用visit方法来访问子节点。忘记调用的后果就是对应的子树将不会被访问。语法文件005/Java.g4grammar Java;classDeclaration : 'class' Identifier classBody ;methodDeclaration : datatype原创 2022-04-24 16:36:48 · 3875 阅读 · 0 评论 -
(Antlr4 4-1)利用访问器构建一个计算器(Python语言实现)
先来编写一下语法, 并标记备选分支语法文件004/LabeledExpr.g4grammar LabeledExpr;import CommonLexerRules;prog : stat + ;stat : expr NEWLINE # printExpr | ID '=' expr NEWLINE # assign | NEWLINE # blank ;expr原创 2022-03-28 09:16:20 · 1187 阅读 · 0 评论 -
(Antlr4 3-2) 构建语言类应用程序(python语言实现)
这一节,我们要将Java中,类似{99, 3, 451}的short数组翻译成"\u0063\u003\u01c3".为了完成这项工作,最简单的方案是使用ANTLR内置的语法分析树遍历器进行深度优先遍历,然后在它触发的一系列回调函数中进行适当操作。语法文件请参考 上一节002/ShortToUnicodeString.pyfrom ArrayInitParser import ArrayInitParserfrom ArrayInitListener import ArrayInitListe原创 2022-03-21 13:45:06 · 1254 阅读 · 0 评论 -
(Antlr4 3-1) 将生成的语法分析器与Python程序集成
前提安装python环境下的antlr运行时库pip install antlr4-python3-runtime准备文法文件002/ArrayInit.g4grammar ArrayInit;init : '{' value (',' value)* '}' ;value : init | INT ;INT: [0-9]+ ;WS: [ \t\r\n] -> skip ;将文法文件转换为Python语言的词法分析器和语法分析器cd 00原创 2022-03-16 14:45:57 · 1400 阅读 · 0 评论 -
(Antlr4 2-4) 监听器与访问器
ANTLR的运行库提供了两种遍历树的机制:语法分析树监听器与访问器。通过它们,我们可以在遍历树的时候实现相应逻辑。监听器:使用监听器时,需要继承Listener类,类的方法会被antlr提供的遍历器对象(比如ParseTreeWalker)自动调用。ANTLR为每个语法文件生成一个ParserTreeListener的子类,在该类中,语法中的每条规则都有对应的enter和exit方法,例如:ORACLEListener.py# This class defines a complete lis原创 2022-03-06 16:29:03 · 644 阅读 · 0 评论 -
(Antlr4 2-3) 使用语法分析树构建语言类应用程序
构建语言类应用程序,最简单的方式是操作语法分析器自动生成的语法分析树。ANTLR在识别和建立语法分析树的过程中使用的数据结构和类名 如下:词法分析器处理字符序列并将生成的词法符号提供给语法分析器,语法分析器随即根据这些信息来检查语法的正确性并建造一颗语法分析树。这个过程对应的ANTLR类是 CharStream、Lexer、Token、Parser,以及ParserTree连接词法分析器和语法分析器的“管道”就是TokenStream,下图展示了这些类型对象在内存中的交互方式ANTLR尽可能多的使原创 2022-03-06 16:22:01 · 510 阅读 · 0 评论 -
Antlr4识别包含引号转义字符串格式
我要识别的字符串格式是使用单引号或双引号引起来的一个字符序列,如"hello world"或'hello world'Antlr4可以这样写词法规则QuotedString: DoubleString | SingleString ;fragmentDoubleString: '"' .*? '"' ;fragmentSingleString: '\'' .*? '\'' ;但是,当我的字符串中存在转义的引号时,上边的词法规则是无法正确识别的,如"hello \"world\"原创 2022-02-15 15:47:43 · 1419 阅读 · 0 评论 -
Antlr4将关键字作为标识符使用
在定义词法文件时,需要先定义关键词,再定义标识符的规则,例如如下边这个示例//匹配关键字CREATEK_CREATE: 'CREATE' ;//匹配标识符--字母数字下划线组成的字符串,但必须字母或下划线开头ID: [a-zA-Z_]+[a-zA-Z0-9_]* ;在语法文件中,我们定义一个变量名的语法,而变量名规则就是标识符varName: ID ;这时候会出现一个问题:当使用"CREATE"作为varName时是无法被识别的,虽然它满足词法"ID"的规则,原因是"CREATE"被识别成原创 2022-02-12 10:08:49 · 621 阅读 · 0 评论 -
Python实现Antlr文法转语法图(铁路图)
在网上找了很久Antlr文法转语法图的工具也没有找到,只能自己写一个了,效果还不错~先看下效果,语法定义如下:ref_cursor_type_definition : TYPE type IS REF CURSOR (RETURN ((db_table_or_view | cursor | cursor_variable) '%' ROWTYPE | record PERCENT TYPE | record_type | ref_cursor_type))? ';'原创 2022-01-05 15:50:28 · 7204 阅读 · 2 评论 -
通过SQL操作Excel(基于Python + Antlr实现)
ANTLR工具本身是用JAVA语言编写的,想要在Python环境中使用,需要进行简单的环境准备,参考:Python中使用Antlr4的环境准备实现功能创建数据库:通过create database语句创建一个excel文件创建表:通过create table语句新增一个sheet删除表:通过drop table语句删除指定的sheet插入数据:通过insert into table语句向sheet中插入数据删除数据:通过delete from table语句删除sheet中符合条件的行更新数原创 2021-12-13 10:36:34 · 7986 阅读 · 0 评论 -
(Antlr4 1-1)Python中使用Antlr4的环境准备
准备Java环境,以下是我的Java版本,运行环境是win10当然,你更要又Python3环境…C:\Users\aaa>java -versionjava version "1.8.0_112"Java(TM) SE Runtime Environment (build 1.8.0_112-b15)Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)下载ANTLR tool下载地址:https://www.a原创 2021-12-09 14:54:35 · 5919 阅读 · 0 评论