MDSF:代码生成(Code Generation)介绍

MDSF:代码生成(Code Generation)介绍

  在实现模型驱动开发中,我们可以解释模型直接运行在领域框架之上,也可以把模型通过代码生成技术转换成代码之后编译运行在框架之上。这两种方式都有利弊,可以搭配使用,在OpenExpessApp中将采用这两种方法,类库通过代码生成,UI等元模型通过框架解释执行。由于代码生成是MDD中很重要的一项技术,所以本篇我将介绍一下代码生成相关的知识。

模型驱动中的代码生成

MDSF:代码生成(Code Generation)介绍

在EMF中,Metamodel为EMF元模型,Model为EMF模型;在MS DSL Tools中,MetaModel为DSL元模型,模板为T4模板

MDSF:代码生成(Code Generation)介绍

代码生成技术

MDSF:代码生成(Code Generation)介绍

  • Antlr3
    Antlr是一个非常著名的开源语言生成工具,官方网站是这么介绍的:
    ANTLR, ANother Tool for Language Recognition, is a languagetool that provides a framework for constructing recognizers,interpreters, compilers, and translators from grammatical descriptionscontaining actions in a variety of targetlanguages. ANTLR provides excellent support for treeconstruction, tree walking, translation, error recovery, and errorreporting. There are currently about 5,000 ANTLR sourcedownloads a month.

  研究过一阵子Antlr,用它来写过一个.Net下的表达式引擎,参考使用Antlr实现表达式引擎

  使用Antlr的一般经过如下步骤:

  1. 写语法
  2. 写StringTemplate模板(可选)
  3. 在AntlrWorks调试语法
  4. 从语法生成类
  5. 使用生成的类来写应用程序

  作者写了一本介绍Antlr的专著 The Definitive Antlr Reference,我只是几年前大概看过一遍,觉得作者很牛。不过作者又出的另外一本书Language Implementation Patterns,有人说这本书更好,它将ANTLR内部的设计思想也讲得很清楚了。相比而言,之前那本书只能算是ANTLR的用户手册,而新书算是ANTLR的设计思想。

MDSF:代码生成(Code Generation)介绍        MDSF:代码生成(Code Generation)介绍


  • Irony – .NET Language Implementation Kit

    Irony是在Codeplex网站上的一个开源语言实现工具,官方介绍如下:
     
     Irony is a development kit for implementing languages on .NET platform. It uses the flexibility and power of c# language and .NET Framework 3.5 to implement a completely new and streamlined technology of compiler construction. Unlike most existing yacc/lex-style solutions Irony does not employ any scanner or parser code generation from grammar specifications written in a specialized meta-language. In Irony the target language grammar is coded directly in c# using operator overloading to express grammar constructs. Irony’s scanner and parser modules use the grammar encoded as c# class to control the parsing process. See the expression grammar sample for an example of grammar definition in c# class, and using it in a working parser.

MDSF:代码生成(Code Generation)介绍

……

代码生成定义语言

  在特定领域建模 DSM(Domain Specific)介绍中介绍了DSM的不同工具的比较,其中代码生成定义语言也可以从表中看到,下面将会介绍一下DSL tools的T4和MetaEdit+的MERL(MetaEdit+ Reporting Language):

MDSF:代码生成(Code Generation)介绍

  • MetaEdit+的MERL语言
    MetaEdit+提供代码生成编辑器,还支持生成的调试。OpenExpressApp采用类似MetaEdit+的元元模型来编写语言,所以将来的代码生成可能也会主要参考它来做。具体可参考安装程序目录中的User’s Guides MetaEdit+ Workbench 代码生成章节内容
    MDSF:代码生成(Code Generation)介绍

    MDSF:代码生成(Code Generation)介绍

它的一个Report示例:

 

  Report 'Test'
  foreach .State [Watch]
  {  'State : '
     :State name;
     newline
     'Connects to: '
     newline
     do ~From>()~To.State [Watch]
     {  ' 	'
        :State name;
        newline
     }
     newline
  }
  endreport 

 

它的语法定义如下:

STRING	: "'" CHAR* "'"
where CHAR is any character; a ' character must be doubled
NUMBER	: ("0".."9")+
NAMECHAR	: "a".."z" | "0".."9" | " " | {_+-[]?} | INTLNAMECHAR | ESCAPECHAR
INTLNAMECHAR	: {äëïöü} | {áéíóú} | {àèìòù} | {âêîôû} | {ñãœçÿ} | {߀} | {¿¡«»}
ESCAPECHAR	: "\" ECHAR
where ECHAR is anything that is not a letter number or underscore
NAME	: NAMECHAR+
If NAME contains a space, the whole name should have a ";" after it, or one of ".>~#" forming the start of the next element in a chainClause
WILDNAME	: ["^"] (NAMECHAR | "*" | "#")+
If WILDNAME contains a space, the whole name should have a ";" after it.
# 	Design element access and output commands (5.3.2)
chainOutputClause	: (propClauseWithLevel | propClause | (graphEltClause+ propClause)) [";"] [translatorNames] [";"];
translatorNames	: ("%" <NAMECHAR>+)+;
propClauseWithLevel	: propClause levelNumber [";"];
levelNumber	: [";"] " "* ["-"] <NUMBER>+;
propClause	: ":" (<NAME> | "()");
graphEltClause	: (objClause | relClause | roleClause | portClause) [";"]
objClause	: "." typeChoiceClause
relClause	: ">" typeChoiceClause
roleClause	: "~" typeChoiceClause
portClause	: "#" typeChoiceClause
typeChoiceClause	: NAME
	| "()"
	| "( " WILDNAME {" | " WILDNAME}* ")"
# 	General commands (5.3.3)
report	: oldreport | newreport;
oldreport	: "report" <STRING> clause* "endreport";
newreport: 	[newheadersection] clause*;
newheadersection	: <NAME> ["(" [<NAME> ("," <NAME>)*] ")" ];
clause	: (comment
| basicClause
| ifClause
| loop
| subreportClause
| fileClause
| md5Clause
| executeClause
| promptAskClause
| variableAssign
| variableClause
| translationClause
| mathClause
| chainOutputClause
;
comment	: <comment>;
basicClause	: atomicClause | iterableClause;
atomicClause	: newlineClause | separatorClause | literal | variableRef | simpleClause;
newlineClause	: "newline" [";"];
separatorClause	: "sep" [";"];
literal	: <STRING> [translatorNames] [";"];
variableRef 	: "$" <NAME> [translatorNames] [";"];
simpleClause	: ("id" | "type" | "metatype" | "oid" | "projectid" | "objectid" | "project") [levelNumber] [";"] [translatorNames] [";"]
|
("x" | "y" | "left" | "right" | "top" | "bottom" | "centerX" | "centerY" | "width" | "height" | "area") [levelNumber] [";"] [translatorNames] [";"];
iterableClause	: ("decompositions" | "explosions" | "containers" | "contents" | "stack" | "graphs") [";"];
# 	Control and navigation commands (5.3.4)
ifClause	: "if" [condition]
"then" [";"] (clause* | ";")
["else" [";"] clause*]
"endif" [";"];
condition	: ("not" condition)
| (condition "and" condition)
| (condition "or" condition)
| ("(" condition ")")
| expression;
expression	: comparison | unary;
unary	: comparableClause;
comparison	: comparableClause comp comparableClause
["num"];
comparableClause 	: atomicClause | chainClause;
comp	: "<" | ">" | "<=" | ">=" | "=" | "<>" | "=~" | "=/";
loop	: ("do" | "dowhile")
(chainClause | atomicClause)
[whereClause] [filterClause]
"{" clause* "}" [";"]
|
"foreach"
graphEltClause [";"]
[whereClause] [filterClause]
"{" clause* "}" [";"];
chainClause	: (chainElementClause [levelNumber] [";"])+;
chainElementClause	: graphEltClause | propClause | iterableClause;
whereClause	: "where" condition;
filterClause	: orderbyClause [uniqueClause]
| uniqueClause;
orderbyClause 	: "orderby" orderCriterion ("," orderCriterion)*;
uniqueClause 	: "unique" [clause+ ("," clause+)*];
orderCriterion	: clause+ ["num"] ["asc" | "desc"];
subreportClause	: ("subreport" | "subgenerator") [";"] clause* "run" [";"];
# 	External I/O commands (5.3.5)
fileClause	: outputFileClause | filenameReadClause | filenamePrintClause;
outputFileClause	: "filename" [";"] clause*
["encoding" [";"] clause+]
["md5start" [";"] clause+]
["md5stop" [";"] clause+]
modeClause clause*
"close" [";"];
modeClause	: ("write" | "merge" | "append") [";"];
filenameReadClause	: "filename" [";"] clause*
["encoding" [";"] clause+]
"read" [";"];
filenamePrintClause	: "filename" [";"] clause* "print" [";"];
md5Clause	: "md5id" [";"] clause* "md5Block" [";"]
clause*
"md5sum" [";"];
executeClause	: ("external" | "internal") [";"]
clause*
("execute" | "executeBlocking") [";"];
promptAskClause	: "prompt" [";"] clause* "ask" [";"];
# 	String and number commands (5.3.6)
variableClause	: variableReadClause | variableWriteClause;
variableReadClause	: "variable" [";"] clause+ "read" [";"];
variableWriteClause	: "variable" [";"] clause+
variableModeClause clause* [";"]
"close" [";"];
variableModeClause	: ("write" | "append") [";"];
variableAssign	: "$" <NAME> "=" [";"] (variableAssign | basicClause | chainOutputClause);
translationClause	: "to" [";"] clause*
["translate" [";"] clause*]
"endto" [";"];
mathClause	: "math" [";"] clause* "evaluate" [";"];

书籍

MDSF:代码生成(Code Generation)介绍

What’s Inside:

  • Code generation basics
  • CG techniques and best practices
  • Patterns of CG design
  • How to deploy generators
  • Many example generators

Includes generators for:

  • Database access
  • RPC
  • Unit tests
  • Documentation
  • Business logic
  • Data translation

 

MDSF:代码生成(Code Generation)介绍        MDSF:代码生成(Code Generation)介绍

LOP中的代码生成 

  LOP中的代码生成有三种主要的方法,我们将结合使用它们来定义模型转换;第一种是遍历方式,你枚举源模型中所有节点,检视每一个,并基于检视到的信息生成目标模型中的一些目标节点;第二种方式是使用模板和宏来定义如何生成目标语言;第三种方式是使用模式匹配来查找在源模型中的哪些节点上应用转换。

 

Code Generation by Model Transformation – A Case Study in Transformation Modularity

 

 

推荐:你可能需要的在线电子书MDSF:代码生成(Code Generation)介绍

 

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101213.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Springboot整合shiro_spring boot框架介绍

    Springboot整合shiro_spring boot框架介绍Shiro介绍Shiro是一款安全框架,主要的三个类Subject、SecurityManager、RealmSubject:表示当前用户SecurityManager:安全管理器,即所有与安全有关的操作都会与SecurityManager交互;且其管理着所有Subject;可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于SpringMVC中DispatcherServlet的角色Realm:Shiro从Realm获取安全数据(如用户、角色、权限)Shiro

  • 【实战】javaweb学生信息管理系统[通俗易懂]

    javaweb学生信息管理系统总的来说整个项目通过Maven来管理jar包,实现了学生信息管理系统的登录,增删改查等基本操作,然后不喜写css样式,页面有点丑,但是代码中的逻辑基本正确。项目下载链接csdn下载链接github地址一、项目架构二、数据库的设计操作1.user表2.student表三、登录界面(动态生成验证码、提示账号or密码or验证码输入有误)四、登录的主界面五…

  • axios发送cookie_js跨域设置cookie

    axios发送cookie_js跨域设置cookie背景在开发vue的项目时,使用axios来与后端交互,经常会遇到几个问题请求跨域请求中带cookies请求跨域解决方案解决请求跨域有以下两种方案同源访问后端允许跨域请求这里主要针对非同源情况做介绍,解决请求跨域需要后端配合处理,下面直接看代码,这里的demo中,前端运行在localhost:1234,后端运行在localhost:3000,不满足同源协议axios发起请求impo…

  • Java考试题30道(附答案)

    Java考试题30道(附答案)1. 在WEB-INF目录下,必须存放的文件为:   BA.class文件B.web.xmlB.jar文件D.html文件2.下面哪个不是JAVA关键字  A  A integer  B double  C float  D default3. 构造函数何时被调用( )  BA.类定义时B.创建对象时C.调用对象方法时D.使用对象的变量时4. 下面哪项不是respons…

  • python分苹果问题_给大家分享一个「Python算法题」分苹果

    python分苹果问题_给大家分享一个「Python算法题」分苹果今天刷到一道算法题,分享一下果园里有堆苹果,N(1<N<9)只熊来分。第一只熊把这堆苹果平均分为N份,多了一个,它把多的一个扔了,拿走了一份。第二只熊把剩下的苹果又平均分成N份,又多了一个,它同样把多的一个扔了,拿走了一份,第三、第四直到第N只熊都是这么做的,问果园里原来最少有多少个苹果?可以先尝试一下再往下看(N=5的时候,答案是3121)。先简单分析一下这道题目,假设当第k个熊取完之后还有M个…

    2022年10月10日
  • UFT12.02安装

    UFT12.02安装1.打开安装程序 2.选择语言3.选择插件4.UFT配置5.安装6.安装完成7.自述文件8.启动UFT9.进入UFT后的界面

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号