基于Antlr的Modelica3.5语言解析
背景
Modelica语言是一种统一面向对象的系统建模语言
官方文档中明确写明了语法规范
在附录的第一章词法,第二章语法都完整的罗列的语言规范,对于Antlr适配特别好
- 只需要把[]修改为Antlr的问号'?'
- 把{}修改为'*'
- 把双引号修改为单引号
- 标蓝色的字符串常量增加单引号
- 中横线修改为下划线
- 增加rule尾部的结束分号
- 有些地方的=更换为冒号:
Antlr g4文件如下
grammar Modelica;
stored_definition
:( 'within' ( name )? ';' )? ( ( 'final' )? class_definition ';' )*;
class_definition :
( 'encapsulated' )? class_prefixes class_specifier;
class_prefixes :
( 'partial' )?
( 'class'
| 'model'
| ( 'operator' )? 'record'
| 'block'
| ( 'expandable' )? 'connector'
| 'type'
| 'package'
| ( 'pure' | 'impure' )? ( 'operator' )? 'function'
| 'operator'
);
class_specifier :
long_class_specifier | short_class_specifier | der_class_specifier;
long_class_specifier :
IDENT description_string composition 'end' IDENT
| 'extends' IDENT ( class_modification )? description_string composition
'end' IDENT;
short_class_specifier :
IDENT '=' base_prefix type_specifier ( array_subscripts )?
( class_modification )? description
| IDENT '=' 'enumeration' '(' ( ( enum_list )? | ':' ) ')' description;
der_class_specifier :
IDENT '=' 'der' '(' type_specifier ' ,' IDENT ( ' ,' IDENT )* ')' description;
base_prefix :
( 'input' | 'output' )?;
enum_list :
enumeration_literal ( ',' enumeration_literal )*;
enumeration_literal :
IDENT description;
composition :
element_list
( 'public' element_list
| 'protected' element_list
| equation_section
| algorithm_section
)*
( 'external' ( language_specification )?
( external_function_call )? ( annotation_clause )? ';' )?
( annotation_clause ';' )?;
language_specification :
STRING;
external_function_call :
( component_reference '=' )?
IDENT '(' ( expression_list )? ') ';
element_list :
( element ';' )*;
element :
import_clause
| extends_clause
| ( 'redeclare' )?
( 'final' )?
( 'inner' )? ( 'outer' )?
( class_definition
| component_clause
| 'replaceable' ( class_definition | component_clause )
( constraining_clause description )?
);
import_clause :
'import'
( IDENT '=' name
| name ( '.*' | '.' ( '*' | '(' import_list ')*' ) )?
)
description;
import_list :
IDENT ( ' ,' IDENT )*;
extends_clause :
'extends' type_specifier ( class_modification )? ( annotation_clause )?;
constraining_clause :
'constrainedby' type_specifier ( class_modification )?;
component_clause :
type_prefix type_specifier ( array_subscripts )? component_list;
type_prefix :
( 'flow' | 'stream' )?
( 'discrete' | 'parameter' | 'constant' )?
( 'input' | 'output' )?;
component_list :
component_declaration ( ' ,' component_declaration )*;
component_declaration :
declaration ( condition_attribute )? description;
condition_attribute :
'if' expression;
declaration :
IDENT ( array_subscripts )? ( modification )?;
modification :
class_modification ( '=' expression )?
| '=' expression
| ':=' expression;
class_modification :
'(' ( argument_list )? ') ';
argument_list :
argument ( ' ,' argument )*;
argument :
element_modification_or_replaceable
| element_redeclaration;
element_modification_or_replaceable :
( 'each' )? ( 'final' )? ( element_modification | element_replaceable );
element_modification :
name ( modification )? description_string;
element_redeclaration :
'redeclare' ( 'each' )? ( 'final' )?
( short_class_definition | component_clause1 | element_replaceable );
element_replaceable :
'replaceable' ( short_class_definition | component_clause1 )
( constraining_clause )?;
component_clause1 :
type_prefix type_specifier component_declaration1;
component_declaration1 :
declaration description;
short_class_definition :
class_prefixes short_class_specifier;
equation_section :
( 'initial' )? equation ( equation ';' )*;
algorithm_section :
( 'initial' )? 'algorithm' ( statement ';' )*;
equation :
( simple_expression '=' expression
| if_equation
| for_equation
| connect_clause
| when_equation
| component_reference function_call_args
)
description;
statement :
( component_reference ( ':=' expression | function_call_args )
| '(' output_expression_list ') ' ':='
component_reference function_call_args
| 'break'
| 'return'
| if_statement
| for_statement
| while_statement
| when_statement
)
description;
if_equation :
'if' expression 'then'
( equation ';' )*
( 'elseif' expression 'then'
( equation ';' )*
)*
( 'else'
( equation ';' )*
)?
'end' 'if';
if_statement :
'if' expression 'then'
( statement ';' )*
( 'elseif' expression 'then'
( statement ';' )*
)*
( 'else'
( statement ';' )*
)?
'end' 'if';
for_equation :
'for' for_indices 'loop'
( equation ';' )*
'end' 'for';
for_statement :
'for' for_indices 'loop'
( statement ';' )*
'end' 'for';
for_indices :
for_index ( ' ,' for_index )*;
for_index :
IDENT ( 'in' expression )?;
while_statement :
'while' expression 'loop'
( statement ';' )*
'end' 'while';
when_equation :
'when' expression 'then'
( equation ';' )*
( 'elsewhen' expression 'then'
( equation ';' )*
)*
'end' 'when';
when_statement :
'when' expression 'then'
( statement ';' )*
( 'elsewhen' expression 'then'
( statement ';' )*
)*
'end' 'when';
connect_clause :
'connect' '(' component_reference ' ,' component_reference ') ';
expression :
simple_expression
| 'if' expression 'then' expression
( 'elseif' expression 'then' expression )*
'else' expression;
simple_expression :
logical_expression ( ':' logical_expression ( ':' logical_expression )? )?;
logical_expression :
logical_term ( 'or' logical_term )*;
logical_term :
logical_factor ( 'and' logical_factor )*;
logical_factor :
( 'not' )? relation;
relation :
arithmetic_expression ( relational_operator arithmetic_expression )?;
relational_operator :
' <' | ' <=' | ' >' | ' >=' | '==' | ' < >';
arithmetic_expression :
( add_operator )? term ( add_operator term )*;
add_operator :
'+' | '-' | '.+' | '.-';
term :
factor ( mul_operator factor )*;
mul_operator :
'*' | '/' | '.*' | './';
factor :
primary ( ('^' | '.^') primary )?;
primary :
UNSIGNED_NUMBER
| STRING
| 'false'
| 'true'
| ( component_reference | 'der' | 'initial' | 'pure' ) function_call_args
| component_reference
| '(' output_expression_list ') '
| '(' expression_list ( ';' expression_list )* ')?'
| '(' array_arguments ')*'
| 'end';
UNSIGNED_NUMBER :
UNSIGNED_INTEGER | UNSIGNED_REAL;
type_specifier :
('.')? name;
name :
IDENT ( '.' IDENT )*;
component_reference :
( '.' )? IDENT ( array_subscripts )? ( '.' IDENT ( array_subscripts )? )*;
function_call_args :
'(' ( function_arguments )? ') ';
function_arguments :
expression ( ' ,' function_arguments_non_first | 'for' for_indices )?
| function_partial_application ( ' ,' function_arguments_non_first )?
| named_arguments;
function_arguments_non_first :
function_argument ( ' ,' function_arguments_non_first )?
| named_arguments;
array_arguments :
expression ( ' ,' array_arguments_non_first | 'for' for_indices )?;
array_arguments_non_first :
expression ( ' ,' array_arguments_non_first )?;
named_arguments : named_argument ( ' ,' named_arguments )?;
named_argument : IDENT '=' function_argument;
function_argument :
function_partial_application | expression;
function_partial_application :
'function' type_specifier '(' ( named_arguments )? ') ';
output_expression_list :
( expression )? ( ' ,' ( expression )? )*;
expression_list :
expression ( ' ,' expression )*;
array_subscripts :
'(' subscript ( ' ,' subscript )* ')?';
subscript :
':' | expression;
description :
description_string ( annotation_clause )?;
description_string :
( STRING ( '+' STRING )* )?;
annotation_clause :
'annotation' class_modification;
IDENT : NONDIGIT ( DIGIT | NONDIGIT )* | Q_IDENT;
Q_IDENT : '\'' ( Q_CHAR | S_ESCAPE )* '\'';
NONDIGIT : '_' | 'a' .. 'z' | 'A' .. 'Z';
STRING : '"' ( S_CHAR | S_ESCAPE )* '"';
S_CHAR : ~ ["\\] ;
Q_CHAR : NONDIGIT | DIGIT | '!' | '#' | '$' | '%' | '&' | '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | ':' | ';' | '<' | '>' | '=' | '?' | '@' | '[' | ']' | '^' | '{' | '}' | '|' | '~' | ' ' | '"';
S_ESCAPE : '\’' | '\"' | '\?' | '\\'
| '\a' | '\b' | '\f' | '\n' | '\r' | '\t' | '\v';
DIGIT : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
UNSIGNED_INTEGER : DIGIT ( DIGIT )*;
UNSIGNED_REAL :
UNSIGNED_INTEGER '.' ( UNSIGNED_INTEGER )?
| UNSIGNED_INTEGER ( '.' ( UNSIGNED_INTEGER )? )?
( 'e' | 'E' ) ( '+' | '-' )? UNSIGNED_INTEGER
| '.' UNSIGNED_INTEGER ( ( 'e' | 'E' ) ( '+' | '-' )? UNSIGNED_INTEGER )?;
基于Antlr的Modelica3.5语言解析的更多相关文章
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- java环境中基于jvm的两大语言:scala,groovy
一.java环境中基于jvm的两大语言:scala,groovy 可以在java项目里混编这两种语言: scala:静态语言,多范式语言,糅合了面向对象.面向过程:可以与java和net互操作:融汇了 ...
- 基于简单sql语句的sql解析原理及在大数据中的应用
基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...
- 快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC、EntityFrameWork、T4模板技术。
快速开发框架,及库存管理系统,基于easyui框架和C#语言MVC.EntityFrameWork.T4模板技术. 产品界面如下图所示: 源码结构: 开放全部源码,如有需要请联系,QQ:1107141 ...
- C语言解析WAV音频文件
C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...
- 基于openstack stable queens版本阅读解析
基于openstack stable queens版本阅读解析 基于 centos7.5 的linux系统 架构 如下所示,为cinder的官方架构说明: 这里写图片描述 各个组件介绍如下: - DB ...
- 基于.NET环境,C#语言 实现 TCP NAT
基于.NET平台和C#语言实现TCP NAT穿越 1.<C# WinForm 跨线程访问控件(实用简洁写法)> 2.<基于.NET环境,C#语言 实现 TC ...
- 基于 Asp.Net的 Comet 技术解析
Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的说是一种基于现 ...
- VBA中使用JavaScript脚本语言解析JSON数据
JSON:JavaScript 对象表示法(JavaScript Object Notation) 和xml相似,都是文本形式(保存在文本文件中或字符串等形式),比如: jsstr = {" ...
- cJSON_json包的C语言解析库
cJSON库描述 CJSON是一个用于解析JSON包的C语言库,库文件为cJSON.c和cJSON.h, 所有的实现都在这两个文件中.原作者的地址cJSON. JSON包的解析 例如有一个JSON的数 ...
随机推荐
- 前端开发工具VsCode官网下载太慢?直接失败?
我有个朋友来到公司以后,在搭建基本开发环境时,什么nodejs安装包,vscode包等等都是由同事直接分享,然后一键安装,从来没去过官网下载,以至于想更新新版本的时候首次进入官网有点懵逼,相信很多同学 ...
- forEach、for in 、 for of三者的区别
1.for 原始的遍历: 其实除了这三种方法以外还有一种最原始的遍历,自Javascript诞生起就一直用的 就是for循环,它用来遍历数组 var arr = [1,2,3,4] for(var i ...
- python (),[], {}的含义
1.python ()表示元组,元组是一种不可变序列 1)创建如:tuple = (1,2,3) 取数据 tuple[0]...... tuple[0,2].....tuple[1,2]...... ...
- 重新配置 Idea Webapp 部署
一般 Idea 创建一个 Webapp 时已经自动配置好了,但难免出现意想不到的意外,例如,访问资源 404,编译之后没有把 jsp 页面部署进去等问题. 1️⃣第一步,配置 Project Sett ...
- PostgreSQL性能优化综合案例 - 1
[测试模型] 设计一个包含INSERT, UPDATE, SELECT语句的业务模型用于本优化案例. [测试表] create table user_info (userid int, engname ...
- @FileLimit – AOP最佳实践:上传文件大小限制
@FileLimit 结构分析 1.FileLimitUnit 定义枚举:文件的单位 public enum FileLimitUnit { KB, MB, GB } 2.定义注解 import or ...
- js中常用Math对象
js中常用Math对象 Math.round()四舍五入 Math.ceil() ->ceil 天花板--->向上取整 Math.floor() 向下取整 Math.floor(-11.1 ...
- dns服务之bind配置内网解析部分子域名,其它子域名转发
bind配置内网解析部分子域名,其它子域名转发.以下以m.xxx.com和admin.xxx.com由内网dns解析,其它*.xxx.com转发给外网dns解析为例配置.文件/etc/named.co ...
- mapreduce和yarn集群
mapreduce : 先分再合,分而治之 分布式计算概念: 计算方式,与集中式计算相对.将应用拆分成小的部分,分配给多台计算机处理,mapreduce是分布式的计算框架. MR的特点:易于编程,良好 ...
- 阿里云服务器 jdk1.8 安装配置
阿里云服务器 jdk1.8 安装配置 下载/上传 jdk安装包 解压到指定目录 重命名解压后的文件夹名称 配置环境变量 验证JAVA环境是否安装成功 step 0.安装包准备 1 wget --no ...