当前位置: 首页 > news >正文

小江高端网站建设asp怎么新建网站

小江高端网站建设,asp怎么新建网站,印刷报价网站源码下载,淘宝天猫优惠券网站怎么做在这篇文章中#xff0c;我们将看到如何开发一种简单的语言。 我们的目标是#xff1a; 语言的解析器 IntelliJ的编辑器 。 编辑器应具有语法突出显示#xff0c;验证和自动完成功能 我们还将免费提供Eclipse和Web编辑器的编辑器 #xff0c;但请包含您的兴奋之处#… 在这篇文章中我们将看到如何开发一种简单的语言。 我们的目标是 语言的解析器 IntelliJ的编辑器 。 编辑器应具有语法突出显示验证和自动完成功能 我们还将免费提供Eclipse和Web编辑器的编辑器 但请包含您的兴奋之处本文中不再赘述。 去年我专注于学习新知识主要是Web和ops知识但是我仍然最喜欢的一件事就是开发DSL领域特定语言。 我使用的第一个相关技术是Xtext Xtext是一个出色的工具可让您定义语言的语法并生成该语言的出色编辑器。 到目前为止仅针对Eclipse平台进行了开发这意味着可以使用Eclipse开发新语言然后可以在Eclipse中安装生成的编辑器。 最近我使用的Eclipse大大减少了所以直到现在我对Xtext的兴趣逐渐消失直到最后新版本的Xtext仍处于beta版瞄准了IntelliJ。 因此尽管我们将使用Eclipse开发语言然后我们将生成插件以在IntelliJ中使用我们的语言。 我们将要看到的技术可以用于开发任何种类的语言但是我们将把它们应用于特定的情况AST转换。 这篇文章是为Xtext新手准备的我现在不做很多详细介绍我只是分享对IntelliJ目标的第一印象。 考虑到该功能目前是测试版因此我们可能会遇到一些困难。 我们正在尝试解决的问题调整ANTLR解析器以获得出色的AST 我喜欢玩解析器而ANTLR是出色的解析器生成器。 对于像Java这样的功能强大的语言有很多漂亮的语法。 现在问题在于Java之类的语言语法非常复杂并且生成的解析器会生成不易使用的AST。 主要问题是由于如何处理优先规则。 考虑一下Terence Parr和Sam Harwell编写的Java 8语法 。 让我们看看如何定义一些表达式 conditionalExpression: conditionalOrExpression| conditionalOrExpression ? expression : conditionalExpression;conditionalOrExpression: conditionalAndExpression| conditionalOrExpression || conditionalAndExpression;conditionalAndExpression: inclusiveOrExpression| conditionalAndExpression inclusiveOrExpression;inclusiveOrExpression: exclusiveOrExpression| inclusiveOrExpression | exclusiveOrExpression;exclusiveOrExpression: andExpression| exclusiveOrExpression ^ andExpression;andExpression: equalityExpression| andExpression equalityExpression;equalityExpression: relationalExpression| equalityExpression relationalExpression| equalityExpression ! relationalExpression;relationalExpression: shiftExpression| relationalExpression shiftExpression| relationalExpression shiftExpression| relationalExpression shiftExpression| relationalExpression shiftExpression| relationalExpression instanceof referenceType;shiftExpression: additiveExpression| shiftExpression additiveExpression| shiftExpression additiveExpression| shiftExpression additiveExpression;additiveExpression: multiplicativeExpression| additiveExpression multiplicativeExpression| additiveExpression - multiplicativeExpression;multiplicativeExpression: unaryExpression| multiplicativeExpression * unaryExpression| multiplicativeExpression / unaryExpression| multiplicativeExpression % unaryExpression;unaryExpression: preIncrementExpression| preDecrementExpression| unaryExpression| - unaryExpression| unaryExpressionNotPlusMinus; 这只是用于定义表达式的大部分代码的一部分。 现在考虑您有一个简单的preIncrementExpression 类似 a 。 在AST中我们将拥有类型为preIncrementExpression的节点该节点将包含在unaryExpression中。 一元表达式将包含在一个乘法 表达式中该表达式将包含在一个additiveExpression中 依此类推。 该组织对于处理不同类型的运算之间的运算符优先级很有必要因此将1 2 * 3解析为1和 2 * 3的和而不是1 2和3的乘法。 问题是从逻辑的角度来看乘法和加法是同一级别的表达式拥有Matryoshka AST节点没有意义。 考虑以下代码 class A { int a 1 2 * 3; } 虽然我们想要这样的东西 [CompilationUnitContext][TypeDeclarationContext][ClassDeclarationContext][NormalClassDeclarationContext]classA[ClassBodyContext]{[ClassBodyDeclarationContext][ClassMemberDeclarationContext][FieldDeclarationContext][UnannTypeContext][UnannPrimitiveTypeContext][NumericTypeContext][IntegralTypeContext]int[VariableDeclaratorListContext][VariableDeclaratorContext][VariableDeclaratorIdContext]a[VariableInitializerContext][ExpressionContext][AssignmentExpressionContext][ConditionalExpressionContext][ConditionalOrExpressionContext][ConditionalAndExpressionContext][InclusiveOrExpressionContext][ExclusiveOrExpressionContext][AndExpressionContext][EqualityExpressionContext][RelationalExpressionContext][ShiftExpressionContext][AdditiveExpressionContext][AdditiveExpressionContext][MultiplicativeExpressionContext][UnaryExpressionContext][UnaryExpressionNotPlusMinusContext][PostfixExpressionContext][PrimaryContext][PrimaryNoNewArray_lfno_primaryContext][LiteralContext]1[MultiplicativeExpressionContext][MultiplicativeExpressionContext][UnaryExpressionContext][UnaryExpressionNotPlusMinusContext][PostfixExpressionContext][PrimaryContext][PrimaryNoNewArray_lfno_primaryContext][LiteralContext]2*[UnaryExpressionContext][UnaryExpressionNotPlusMinusContext][PostfixExpressionContext][PrimaryContext][PrimaryNoNewArray_lfno_primaryContext][LiteralContext]3;}EOF 虽然我们想要这样的东西 [CompilationUnit][FieldDeclaration][PrimitiveTypeRef][Sum][Multiplication][IntegerLiteral][IntegerLiteral][IntegerLiteral] 理想情况下我们要指定产生Matryoshka风格的AST的语法但在对代码进行分析时使用更平坦的AST因此我们将根据Antlr和“逻辑” AST生成的AST构建适配器。 我们打算如何做 我们将首先开发一种定义节点形状的语言以使它们出现在逻辑AST中并且还将定义如何将Antlr节点 Matryoshka风格的节点映射到这些逻辑节点中。 这只是我们要解决的问题Xtext可用于开发任何一种语言这只是作为一种解析器狂我喜欢使用DSL解决解析器相关的问题。 这是很元的 。 入门安装Eclipse Luna DSL并创建项目 我们将下载一个包含Xtext 2.9 Beta的 Eclipse版本。 在全新的Eclipse中您可以创建一种新型的项目 Xtext Projects 。 我们只需要定义项目的名称然后选择与我们的新语言相关联的扩展名即可 然后我们选择感兴趣的平台是的还有Web平台……我们将在以后进行研究 创建的项目包含一个示例语法。 我们可以按原样使用它我们只需要生成几个运行MWE2文件的文件即可。 运行此命令后我们可以仅在IntelliJ或Eclipse中使用我们的新插件。 但是我们将改为首先更改语法以在光荣的DSL中转换给定的示例。 我们的DSL示例 我们的语言在IntelliJ IDEA中看起来像这样很酷是吗。 当然这只是一个开始但我们开始为Java解析器定义一些基本节点类型 表示可能的修饰语的枚举警告这不是完整列表 CompilationUnit其中包含可选的PackageDeclaration和可能的许多TypeDeclaration TypeDeclaration是一个抽象节点有三种扩展它的具体类型 EnumDeclarationClassDeclaration和InterfaceDeclaration 我们缺少注释声明 我们将需要添加数十个表达式和语句但是您应该对我们尝试构建的语言有所了解。 还要注意我们已经引用了Antlr语法在第一行中但是尚未指定定义的节点类型如何映射到Antlr节点类型。 现在的问题是我们如何构建它 定义语法 我们可以使用简单的EBNF表示法带有一些扩展名来定义语言的语法。 在您的项目中查找带有xtext扩展名的文件 并按如下所示进行更改 grammar me.tomassetti.AstTransformationsDsl with org.eclipse.xtext.common.Terminalsgenerate astTransformationsDsl http://www.tomassetti.me/AstTransformationsDslModel:antlrAntlrGrammarRef declarationsDeclaration*;AntlrGrammarRef:adapt grammarFileSTRING;Declaration: NodeType | NamedEnumDeclaration;NamedEnumDeclaration: enum nameID { valuesEnumNodeTypeFieldValue }; UnnamedEnumDeclaration: enum { valuesEnumNodeTypeFieldValue };NodeType:abstract? type nameID (extends superType[NodeType])? (from antlrNodeID)? { fieldsNodeTypeField*}; NodeTypeField:nameID (many*|optional?|single) valueNodeTypeFieldValue; NodeTypeFieldValue:UnnamedEnumDeclaration | RelationNodeTypeField | AttributeNodeTypeField;EnumNodeTypeFieldValue: nameID;RelationNodeTypeField: type[NodeType];AttributeNodeTypeField:{AttributeNodeTypeField}(string|int|boolean); 我们定义的第一个规则对应于AST的根在本例中为Model 。 我们的模型从对Antlr文件和声明列表的引用开始。 想法是指定我们的“逻辑”节点类型的声明以及应如何将“ antlr”节点类型映射到它们。 因此我们将定义转换该转换将引用在AntlrGrammarRef规则中指定的antlr语法中定义的元素的引用。 我们可以定义Enum或NodeType。 NodeType有一个名称可以是抽象的并且可以扩展另一个NodeType。 请注意 超类型是对NodeType的引用。 这意味着生成的编辑器将自动能够为我们提供自动完成功能列出文件中定义的所有NodeTypes 并进行验证从而验证我们是否引用了现有的NodeType 。 在我们的NodeTypes中我们可以定义任意多个字段 NodeTypeField 。 每个字段均以名称开头后跟一个运算符 * 表示我们可以在此字段中使用0..n值 表示该字段是可选的0..1值 表示始终始终存在一个值 NodeTypeField还具有一个值类型该值类型可以是内联定义的枚举 UnnamedEnumDeclaration 关系表示此节点包含其他节点或属性表示此节点具有一些基本属性如字符串或布尔值。 很简单是吗 因此我们基本上重新运行了MWE2文件我们准备好了。 查看实际使用的插件 要查看我们在IntelliJ IDEA中安装的插件我们只需要从包含想法插件的目录在本例中为me.tomassetti.asttransf.idea 运行gradle runIdea 。 请注意您需要使用gradle的最新版本并且需要定义JAVA_HOME 。 此命令将下载IntelliJ IDEA安装我们开发的插件并启动它。 在打开的IDE中您可以创建一个新项目并定义一个新文件。 只需使用我们在创建项目时指定的扩展名本例中为.anttr   IDEA应该使用我们新定义的编辑器。 目前验证工作正常但编辑器的反应似乎很慢。 自动完成功能反而对我不利。 考虑到这只是一个beta因此我希望这些问题在Xtext 2.9发布之前会消失。 下一步 我们才刚刚起步但是令人惊奇的是如何在几分钟内就可以使用其IDEA编辑器创建DSL。 我计划朝几个不同的方向工作 我们需要了解如何打包和分发插件我们可以使用gradle runIdea尝试使用它但我们只想生成一个二进制文件供人们安装而无需处理编辑器的源代码 使用来自Maven的任意依赖项这将变得相当复杂因为Maven和Eclipse插件OSGi捆绑包以自己的方式定义了它们的依赖关系因此通常必须将jar打包成捆绑包才能在Eclipse插件中使用。 但是还有其他选择例如Tycho和p2-maven-plugin 。 剧透 我不希望这太快又容易…… 我们还不能引用Antlr语法中定义的元素。 现在这意味着我们应该能够解析Antlr语法并以编程方式创建EMF模型以便我们可以在DSL中引用它。 它需要了解EMF并且需要一些时间……。 我将在将来使用它这可能需要使用loooong教程。 结论 尽管我不再喜欢Eclipse现在我已经习惯了IDEA但对我来说似乎更好了更快更轻便但是Eclipse Modeling Framework一直是一个非常有趣的软件并且能够与IDEA一起使用非常棒。 一段时间以来我没有使用EMF和Xtext不得不说我看到了一些改进。 我觉得Eclipse不太命令行友好并且通常很难将其与CI系统集成。 我看到正在为解决这些问题而努力请参阅Tycho或我们用来使用开发的编辑器启动IDEA的gradle作业这对我来说似乎非常积极。 我的理念是混合技术以务实的方式结合不同世界的最佳方面因此我希望有时间玩这些东西。 翻译自: https://www.javacodegeeks.com/2015/08/develop-dsls-for-eclipse-and-intellij-using-xtext.html
http://www.pierceye.com/news/341428/

相关文章:

  • 安徽省建设厅网站首页wordpress和typecho
  • 网站开发考试题torrentkitty磁力猫引擎
  • 如何把电脑改成服务器 做网站微信网站背景图片
  • 淘宝客网站建设详细教程链接交换平台
  • 外贸门户网站深圳网站制作开发排名
  • 如何建设一个稳定的网站photoshop网页制作视频教程
  • 企业网站建设合作合同28招商加盟网
  • 国外设计灵感网站WordPress数据库添加管理员
  • 山东省建设备案网站审批表免费设计手写签名
  • 家庭电脑做网站深圳罗湖网站制作公司
  • 聊城做wap网站服务有哪些做特卖的网站有哪些
  • wordpress後台建站flash美食网站论文
  • 网站服务器ip地址在哪里看用记事本做电影介绍的网站
  • 重庆企业建站公司沧浪企业建设网站价格
  • 免费建单页网站厂房出租做推广什么网站好
  • jquery网站模板下载做的网站显示不了背景图片
  • 图书管理系统网站开发教程怎么创建自己的网址
  • 网站网站是怎么做的专业app开发制作团队
  • 平顺网站建设应届生在淮北招的网站建设类型岗位
  • 手机网站模板尺寸wordpress5.1更新
  • 微网站设计教育培训机构官网
  • 搭建论坛网站福州工程网站建设团队
  • 易语言跳到指定网站怎么做商业网站建设方案
  • 专业的饰品行业网站开发杭州市建设厅网站
  • 做仿站如何获取网站源码鞍山网站建设优化
  • 网站建设模拟实验报告wordpress表excel插件
  • 苏州企业网站建设电话包头网站制作公司
  • 邓州微网站建设上海十大广告公司排名
  • 深圳装修公司报价网络优化公司排名
  • 互联网建设网站的的好处中国建盏大师排名2021