Hive-技术补充-ANTLR的真实语法世界

一、上下文

上一篇博客<Hive-技术补充-ANTLR语法编写>,我们了解了如何使用ANTLR语法来表达词法结构和语法结构,下面我们循循渐进的处理身边用过的一些文件或语言:

CSV、JSON、DOT、Cymbol、R 

二、解析CSV文件

有这样一份csv文件

vi data.csv

Details,Month,Amount
Mid Bonus,June,"$2,000"
,January,"""zipoo"""
Total Bonuses,"","$5,000"

可以看到标题行和内容行并无区别,我们需要写一个单独规则来匹配标题

vi CSV.g4

grammar CSV;
file : hdr row+;
hdr : row;
row : filed (',' filed)* '\r'?'\n' ;
filed : TEXT
        | STRING
        | 
        ;
TEXT : ~[,\n\r"]+ ;
STRING : '"'('""'|~'"')* '"' ;; //两个双引号是对双引号的转义

为了不混淆,我们引入一个名为hdr的新规则

下面我们来测试下

antlr4 CSV.g4

javac CSV*.java

grun CSV file -tokens data.csv

grun CSV file -tree data.csv

grun CSV file -gui data.csv

三、解析JSON

1、语法规则

JSON语法指明,一个JSON文件可以是一个对象,或者是一个由若干个值组成的数组。

从语法上看,这不过是一个选择模式,因此可以这样表达

json : object 
    | array 
    ;

对于object,JSON语法指明,一个对象是以一个 { 开始 且以 } 结束。每个值后面跟一个 :  键之间由 , 号分割,对象中的键必须是字符串

我们根据JSON语法指明的自然语言来编写下语法规则

object : '{' pair (',' pair )* '}'
    | '{' '}'     //空对象
    ;
pair : STRING ':' value ;

 也可以优雅的写成这样

object 
    {}
    {members}
members : 
    pair
    pair , members
pair 
    string : value

members是之前我们没有使用过的规则,这是一种不使用(...)* 循环来表达序列模式的方式 

对于array,JSON语法指明,数组是一组值的有序集合,开始于 [ 结束于 ] 中间的值用 , 隔开

array : '[' pair (',' pair )* ']'
    | '[' ']'     //数组
    ;

 但是中间的值可以是一个字符串、一个数字、一个布尔值、null、一个对象、或者一个数组,而且这些结构还可能发生嵌套

value : STRING
    | NUMBER
    | object
    | array        //递归调用
    | 'true'    //递归调用
    | 'false'    //关键字
    | 'null'
    ;

2、词法规则

字符串:

        一个由零个或多个Unicode字符组成的序列,由双引号包裹,其中的字符使用\转义 

        如:\" \\ \/ \b \f \n \r \t \u

        词法定义如下:

    STRING : '"' (ESC | ~["\\])* '"' ;
    fragment ESC : '\\' ([\\/bfnrt] | UNICODE)
    fragment UNICODE : 'u' HEX HEX HEX HEX ;
    fragment HEX : [0-9a-fA-F] ;

        fragment 不是词法符号 而是声明一些可以被其他词法分析器规则使用的规则

        数字:

NUMBER : '-'?INT '.' INT EXP ?    //1.35 1.36E-9  -4.6
        | '-'? INT EXP                 //1e10 -3e4
        | '-'? INT                     //-3 59
        ;
 

另外json需要额外处理空白字符 

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

3、测试

vi JSON.g4 

grammar JSON;
json : object 
    | array 
    ;
object : '{' pair (',' pair )* '}'
    | '{' '}'     //空对象
    ;
pair : STRING ':' value ;
array : '[' pair (',' pair )* ']'
    | '[' ']'     //数组
    ;
value : STRING
    | NUMBER
    | object
    | array        //递归调用
    | 'true'    //递归调用
    | 'false'    //关键字
    | 'null'
    ;
STRING : '"' (ESC | ~["\\])* '"' ;
fragment ESC : '\\' ([\\/bfnrt] | UNICODE) ;
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;
NUMBER : '-'?INT '.' INT EXP ?    //1.35 1.36E-9  -4.6
    | '-'? INT EXP                 //1e10 -3e4
    | '-'? INT                     //-3 59
    ;
fragment INT : '0' | [1-9] [0-9]* ;  //除0外的数字不允许以0开始
fragment EXP : [Ee] [+\-]? INT ; //\-是-的转义  因为[] 中 - 用于表达 “范围” 含义
WS : [ \r\t\n]+ -> skip ;
STRING : '"' (ESC | ~["\\])* '"' ;
fragment ESC : '\\' ([\\/bfnrt] | UNICODE)
fragment UNICODE : 'u' HEX HEX HEX HEX ;
fragment HEX : [0-9a-fA-F] ;
NUMBER : '-'?INT '.' INT EXP ?    //1.35 1.36E-9  -4.6
    | '-'? INT EXP                 //1e10 -3e4
    | '-'? INT                     //-3 59
    ;
WS : [ \r\t\n]+ -> skip ;

antlr4 JSON.g4

javac JSON*.java

输入 [1,"\u0049",1.3e9]

grun JSON json -tokens

grun JSON json -tree

grun JSON json -gui

四、解析R语言

R是一门极富表现力的领域特定编程语言,专门用于描述和解决统计学问题。

vi t.R

addMe <- function(x,y) {return(x+y)}
addMe(x=1,2)
r <- 1:5

vi R.g4

grammar R;
prog:    ( expr_or_assign(';'|NL)
    |    NL
    )*
    EOF
    ;
expr_or_assign 
    : expr('<-'|'='|'<<-') expr_or_assign
    | expr
    ;
//Match both linux and win newLines
NL : '\r'?'\n' ;

expr : expr '[[' sublist ']' ']' //'[['源于R语言的yacc语法
    | expr '[' sublist ']'
    | expr ('::'|':::') expr
    | expr ('$'|'@') expr
    | expr '^'<assoc=right> expr
    | ('-'|'+') expr
    | expr ':' expr
    | expr USER_OP expr //任意被 % 包围的文本:'%' .* '%'
    | expr ('*'|'/') expr
    | expr ('+'|'-') expr
    | expr ('>'|'>='|'<'|'<='|'=='|'!=') expr
    | expr '!' expr
    | expr ('&'|'&&') expr
    | expr ('|'|'||') expr
    | '-' expr
    | expr '-' expr
    | expr ('->'|'->>'|':=') expr
    |'{' exprlist '}' //复合语句
    | 'if' '(' expr ')' expr 
    | 'if' '(' expr ')' expr 'else' expr
    | 'for' '(' ID 'in' expr ')' expr
    | 'while' '(' expr ')' expr
    | 'repeat' expr
    | '?' expr //获取expr的帮助信息,通常是字符串或者标识符
    | 'next'
    | 'break'
    ;
exprlist
    : expr_or_assign ((';' | NL) expr_or_assign?)*
    |
    ;
    
formlist
    : form (',' form)* ;
form
    : ID 
    | ID '=' expr 
    | '...'
    ;
sublist
    : sub (',' sub)* ;
sub 
    : expr 
    | ID '='
    | ID '=' expr
    | STRING '='
    | STRING '=' expr
    | 'NULL' '='
    | 'NULL' '=' expr
    | '...'
    |
    ;
ID  : '.' (LETTER|'_'|'.') (LETTER|DIGIT|'_'|'.')*
    | LETTER(LETTER|DIGIT|'_'|'.')*
    ;
fragment DIGIT : [0-9]; //匹配单个数字
fragment LETTER : [a-zA-Z] ;

antlr4 R.g4

javac R*.java

grun R prog -gui t.R

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/497527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【详细讲解PostCSS如何安装和使用】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

HarmonyOS 应用开发之UIAbility组件基本用法

UIAbility组件的基本用法包括&#xff1a;指定UIAbility的启动页面以及获取UIAbility的上下文 UIAbilityContext。 指定UIAbility的启动页面 应用中的UIAbility在启动过程中&#xff0c;需要指定启动页面&#xff0c;否则应用启动后会因为没有默认加载页面而导致白屏。可以在…

软件概要设计说明书word原件(实际项目)

一、 引言 &#xff08;一&#xff09; 编写目的 &#xff08;二&#xff09; 范围 &#xff08;三&#xff09; 文档约定 &#xff08;四&#xff09; 术语 二、 项目概要 &#xff08;一&#xff09; 建设背景 &#xff08;二&#xff09; 建设目标 &#xff08;三&a…

Jupyter开启远程服务器(最新版)

Jupyter Notebook 在本地进行访问时比较简单&#xff0c;直接在cmd命令行下输入 jupyter notebook 即可&#xff0c;然而notebook的作用不止于此&#xff0c;还可以用于远程连接服务器&#xff0c;这样如果你有一台服务器内存很大&#xff0c;但是呢你又不喜欢在linux上进行操作…

【文本】正则 | 正则表达式收录

1、匹配数字加右括号 1&#xff09;正则 \d\) 2&#xff09;效果 ~~

探索多种数据格式:JSON、YAML、XML、CSV等数据格式详解与比较

title: 探索多种数据格式&#xff1a;JSON、YAML、XML、CSV等数据格式详解与比较 date: 2024/3/28 17:34:03 updated: 2024/3/28 17:34:03 tags: 数据格式JSONYAMLXMLCSV数据交换格式比较 1. 数据格式介绍 数据格式是用于组织和存储数据的规范化结构&#xff0c;不同的数据格…

CSS(二)---【常见属性、复合属性使用】

零.前言 本篇文章主要阐述CSS常见属性、复合属性&#xff0c;更多前置知识请见作者其它文章&#xff1a; CSS(一)---【CSS简介、导入方式、八种选择器、优先级】-CSDN博客 1.CSS属性 CSS的属性有上百个&#xff0c;但是我们并不需要全部学习&#xff0c;只要我们学习一部分…

八大技术趋势案例(人工智能物联网)

科技巨变,未来已来,八大技术趋势引领数字化时代。信息技术的迅猛发展,深刻改变了我们的生活、工作和生产方式。人工智能、物联网、云计算、大数据、虚拟现实、增强现实、区块链、量子计算等新兴技术在各行各业得到广泛应用,为各个领域带来了新的活力和变革。 为了更好地了解…

UI的设计

一、RGB888的显示 即红色&#xff0c;绿色&#xff0c;蓝色都为8位&#xff0c;即通常说的24位色。可以很好显示各种过渡颜色。从硬件上&#xff0c;R、G、B三基色的连接线各需要有8根&#xff0c;即24根数据线&#xff1b;软件上存储的数据量也需要24位&#xff0c;即3个字节&…

Android和IOS应用开发-Flutter应用让屏幕在 app 运行期间保持常亮的方法

文章目录 Flutter应用让屏幕在 app 运行期间保持常亮的方法方法一&#xff1a;使用系统插件方法二&#xff1a;使用 Widgets注意事项 Flutter应用让屏幕在 app 运行期间保持常亮的方法 在 Flutter 开发中&#xff0c;可以使用以下两种方法让屏幕在 app 运行期间保持常亮&#…

数据结构(六)——图

六、图 6.1 图的基本概念 图的定义 图&#xff1a;图G由顶点集V和边集E组成&#xff0c;记为G (V, E)&#xff0c;其中V(G)表示图G中顶点的有限非空集&#xff1b;E(G) 表示图G中顶点之间的关系&#xff08;边&#xff09;集合。若V {v1, v2, … , vn}&#xff0c;则用|V|…

Stable Diffusion WebUI 图生图(img2img):图生图/涂鸦绘制/局部重绘/有色蒙版/上传蒙版/批量处理/反推提示词

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本篇文章我们介绍 Stable Diffusion WebUI 的图生图功能&#xff0c;主要包括&#xff1a;图生图、图生图&#xff08…

TBSI模型论文解读及代码分析

前往我的主页以获得更好的阅读体验 简介 论文来源: Bridging Search Region Interaction With Template for RGB-T Tracking 现有的搜索算法通常会直接连接 RGB 和 T 模态搜索区域, 该方法存在大量冗余背景噪声. 而另一些方法从搜索帧中采样候选框, 对孤立的 RGB 框和 T 框进…

flink on yarn-per job源码解析、flink on k8s介绍

Flink 架构概览–JobManager JobManager的功能主要有: 将 JobGraph 转换成 Execution Graph,最终将 Execution Graph 拿来运行Scheduler 组件负责 Task 的调度Checkpoint Coordinator 组件负责协调整个任务的 Checkpoint,包括 Checkpoint 的开始和完成通过 Actor System 与 …

如何在Apache Arrow中定位与解决问题

如何在apache Arrow定位与解决问题 最近在执行sql时做了一些batch变更&#xff0c;出现了一个 crash问题&#xff0c;底层使用了apache arrow来实现。本节将会从0开始讲解如何调试STL源码crash问题&#xff0c;在这篇文章中以实际工作中resize导致crash为例&#xff0c;引出如何…

论文笔记:分层问题-图像共注意力问答

整理了2017 Hierarchical Question-Image Co-Attention for Visual Question Answering&#xff09;论文的阅读笔记 背景模型问题定义模型结构平行共注意力交替共注意力 实验可视化 背景 视觉问答(VQA)的注意力模型在此之前已经有了很多工作&#xff0c;这种模型生成了突出显示…

elementplus-vue-审核按钮-对话框(Dialog )

效果图&#xff1a; 代码&#xff1a; <template> <el-button type"success" click"dialogVisible true" :icon"Edit">审核</el-button> <el-dialog v-model"dialogVisible" title"是否通过" width&q…

持续集成流水线介绍(CI)

目录 一、概述 二、持续集成的典型操作流程 2.1 概述 2.2 持续集成的操作流程图 2.3 持续集成关键流程说明 三、构建持续集成流水线的方式 3.1 依托云厂商能力 3.2 采用开源产品 3.3 企业自研 四、构建持续化集成流水线 4.1 基于GitHub的持续集成流水线&#xff08;公…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

uniApp使用XR-Frame创建3D场景(5)材质贴图的运用

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解在xr-frame中如何给几何体赋予贴图材质。 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-assets><xr-asse…