2. Language Extension

This page describes how to do language extension through the Spoofax mechanism of exporting source files and importing them in the extension project.

2.1. Exporting source files in base language

Export all relevant source files through the metaborg.yaml file.

exports:
- language: ATerm
  directory: src-gen/syntax
- language: SDF
  directory: src-gen/syntax
  includes: "**/*.sdf"
- language: TemplateLang
  directory: syntax
  includes: "**/*.sdf3"
- language: Stratego-Sugar
  directory: trans
  includes: "**/*.str"
- language: Stratego-Sugar
  directory: src-gen
  includes: "**/*.str"
  excludes: "nabl2/**/*.str"
- language: Stratego-Sugar
  directory: src-gen/nabl2
  includes: "**/*.str"
- language: EditorService
  directory: src-gen
  includes: "**/*.esv"
- language: EditorService
  directory: editor
  includes: "**/*.esv"

Note that you need to export all generated files from the meta languages as well (generated Stratego and SDF from SDF3 and NaBL2 in the above example).

Note that src-gen/nabl2 needs to be its own export, as it is a stratego root directory.

Note that we export the SDF3 source files in order to be able to extend these in a language extension.

Suggestion: move all exported files into a sub-folder with the base-language name to avoid name clashes in the langugage extension.

2.2. Importing source files in language extension

Import the language in the yaml file:

dependencies:
  source:
  - org.metaborg.lang:icedust2:0.6.3-SNAPSHOT

Import all syntax by importing the top-level AST construct in SDF3:

module myextension

imports
  
  Modules //refers to icedust2/syntax/Modules.sdf3

context-free start-symbols
  
  Start

Make the pretty printer work properly by generating it with the base-language name (in metaborg.yaml):

language:
  sdf:
    pretty-print: icedust2

Import all stratego by importing the main stratego file of the base language:

module myextension

imports
  
  icedust2

2.3. Limitations

Currently, importing exported source files only works for Spoofax meta language files.

The following types of files need to be copy pasted currently:

  • files that need to be exported in the final compiler (no re-exporting)
  • native java strategies
  • .tbl files (for parsing Stratego mix syntax)
  • icon files

More info: http://yellowgrass.org/issue/Spoofax/211