Skip to main content

xtext简介

·353 words·2 mins
WFUing
Author
WFUing
A graduate who loves coding.
Table of Contents

Usage
#

项目创建
#

XText 开发一个新的语言

  • 定义 xtext 文件
    • dsl.xtext
    • 包括语法定义,语义(Cross-Reference)定义
  • 生成模型代码
    • XText 根据 dsl.xtextsrc-gen 目录下,生成
      • AST 节点模型类
      • parser,semantic analysis 等阶段需要的 类,如 GrammarAccess,Scope 等
    • 定义 GenerateDsl.mwe2 定义生成流程
    • generateXtendStub = false 禁用 xtend 模板文件生成
  • 编写 Language Implementation
  • 编写 IDE Features

项目初始化

  • 使用 Eclipse 开发 Xtext 应用能够得到最大化的支持,包括 xtext,xtext 语言支持,Editor 支持,自动生成 Artifact 等
  • 由于 Eclipse 一些使用上的原因,建议将 Xtext 当做一个纯 Java 框架进行使用,通过 Gradle 自动根据 xtext 生成源代码,这样能够使用 IDEA 进行开发。

目录结构

  • xxx.dsl
    • 定义 DSL 的核心处理类,包括 Format,Scope,Validation,Code Generation
  • xxx.dsl.ide
    • 定义与 IDE 相关的处理类,包括 Hover,QuickFix 等
    • 与 Language Server 相关的业务逻辑
  • xxx.dsl.tests
    • 测试类

Concepts
#

Xtend
#

  • 一种类似 Java 的语言,包含一些语法糖,如在 Code Generation 使用模板语言定义代码生成过程
  • Xtext 文档和教程中大量使用该语言,但由于 xtent 在 IDEA 中没有支持,建议只使用 Java 进行开发

Inject
#

  • Xtext 框架使用 com.google.inject 库进行依赖注入,注册不同的语言服务(如 GrammarAccess,Formatter)

Grammar Language
#

Module
#

Language Implementation
#

https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html

实现语言的各种功能

CodeGeneration

  • 用于将 AST 解释执行,或翻译为其他代码
  • 如 Model -> Java, YAML 等
  • 实现 IGenerator2 接口
  • 关注对象
    • 当前待生成的资源(语法树子树根节点)
    • 输出管理(输出的内容,输出的文件路径)
    • 引用其他的对象

Validation

  • 静态分析实现 Lint,检测模型是否满足约束
  • 静态分析输出 Errors 与 Warnings,通过 Resource.getErrors()Resource.getWarnings() 获取
  • 类别
    • Automatic Validation
      • Lexer/Parser: 语法校验
      • Linker:交叉引用校验
        • 利用 Scope(符号表)等信息,执行校验
        • 可能会跨多个模块
      • Serializer:Concrete Syntax Validation collapsed:: true
        • 具体的语法验证,当验证通过,说明模型可以被正确序列化
        • TODO: 使用场景
        • 用于模型序列化后,再反序列化回来?
    • Custom Validation
      • 实现 AbstractDslValidator

Linking

  • 实现交叉引用
  • 需要完成两步
    • 在 xtext grammar 文件中,定义交叉引用
    • 通过 Scoping API 声明 Linking 的语义
  • Lazy Link
    • Xtext 建议使用 Lazy Link
    • 通过创建 Proxy 对象实现,当实际访问该 Proxy 对象时,才进行 resolve
  • Scoping
    • 通过 Scoping API 定义如何通过引用找到引用的对象

Tips
#

安装过程可以记录的点

  1. 安装 Eclipse & XText
  1. Eclipse 设置代理
  • 需要使用 http 代理,socks5 代理有些问题
  • Window -> Preference -> Network
  • 设置 http 代理,选择 Active Provider 为 manual
  • 另一个方法是,修改 eclipse.ini
  • 位于 ~/eclipse\java-2023-03\eclipse
  1. VSCode 插件
  • grammarcraft.xtend-lang
  • grammarcraft.xtext-lang

Resource
#


💬评论