init commit again
This commit is contained in:
11
IBAF-Editor/.gitignore
vendored
Normal file
11
IBAF-Editor/.gitignore
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
/.cache
|
||||
/bin
|
||||
/src-gen
|
||||
/target
|
||||
|
||||
/.classpath
|
||||
/.project
|
||||
/.settings
|
||||
/.factorypath
|
||||
|
||||
/.polyglot.metaborg.yaml
|
||||
8
IBAF-Editor/.mvn/extensions.xml
Normal file
8
IBAF-Editor/.mvn/extensions.xml
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<extensions>
|
||||
<extension>
|
||||
<groupId>org.metaborg</groupId>
|
||||
<artifactId>spoofax-maven-plugin-pomless</artifactId>
|
||||
<version>2.5.18</version>
|
||||
</extension>
|
||||
</extensions>
|
||||
1
IBAF-Editor/.mvn/jvm.config
Normal file
1
IBAF-Editor/.mvn/jvm.config
Normal file
@@ -0,0 +1 @@
|
||||
-Xmx512m
|
||||
1
IBAF-Editor/.mvn/maven.config
Normal file
1
IBAF-Editor/.mvn/maven.config
Normal file
@@ -0,0 +1 @@
|
||||
--global-settings .mvn/settings.xml
|
||||
69
IBAF-Editor/.mvn/settings.xml
Normal file
69
IBAF-Editor/.mvn/settings.xml
Normal file
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" ?>
|
||||
<settings
|
||||
xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"
|
||||
>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>add-metaborg-release-repos</id>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>metaborg-release-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/releases/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>metaborg-release-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/releases/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>add-metaborg-snapshot-repos</id>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>metaborg-snapshot-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/snapshots/</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>metaborg-snapshot-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/snapshots/</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
<activeProfiles>
|
||||
<activeProfile>add-metaborg-release-repos</activeProfile>
|
||||
<activeProfile>add-metaborg-snapshot-repos</activeProfile>
|
||||
</activeProfiles>
|
||||
</settings>
|
||||
2
IBAF-Editor/README.md
Normal file
2
IBAF-Editor/README.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# IBAF Language Specification
|
||||
|
||||
10
IBAF-Editor/editor/Analysis.esv
Normal file
10
IBAF-Editor/editor/Analysis.esv
Normal file
@@ -0,0 +1,10 @@
|
||||
module Analysis
|
||||
|
||||
imports
|
||||
|
||||
nabl2/Menus
|
||||
nabl2/References
|
||||
|
||||
language
|
||||
|
||||
observer : editor-analyze (constraint)
|
||||
15
IBAF-Editor/editor/Main.esv
Normal file
15
IBAF-Editor/editor/Main.esv
Normal file
@@ -0,0 +1,15 @@
|
||||
module Main
|
||||
|
||||
imports
|
||||
Menus
|
||||
Syntax
|
||||
Analysis
|
||||
Refactoring
|
||||
|
||||
language
|
||||
|
||||
extensions : iba
|
||||
|
||||
// Add this provider when switching Stratego to interpreted mode:
|
||||
// provider : target/metaborg/stratego.ctree
|
||||
provider : target/metaborg/stratego.jar
|
||||
7
IBAF-Editor/editor/Menus.esv
Normal file
7
IBAF-Editor/editor/Menus.esv
Normal file
@@ -0,0 +1,7 @@
|
||||
module Menus
|
||||
|
||||
menus
|
||||
|
||||
menu: "Generation" (openeditor) (realtime)
|
||||
|
||||
action: "Generate Funcons" = generate-fct
|
||||
7
IBAF-Editor/editor/Refactoring.esv
Normal file
7
IBAF-Editor/editor/Refactoring.esv
Normal file
@@ -0,0 +1,7 @@
|
||||
module Refactoring
|
||||
|
||||
menus
|
||||
|
||||
menu: "Refactoring"
|
||||
|
||||
action: "Rename" = rename-menu-action
|
||||
27
IBAF-Editor/editor/Syntax.esv
Normal file
27
IBAF-Editor/editor/Syntax.esv
Normal file
@@ -0,0 +1,27 @@
|
||||
module Syntax
|
||||
|
||||
imports
|
||||
|
||||
libspoofax/color/default
|
||||
completion/colorer/IBAF-cc-esv
|
||||
|
||||
language
|
||||
|
||||
table : target/metaborg/sdf.tbl
|
||||
start symbols : Start
|
||||
|
||||
line comment : "//"
|
||||
block comment : "/*" * "*/"
|
||||
fences : [ ] ( ) { }
|
||||
|
||||
menus
|
||||
|
||||
menu: "Syntax" (openeditor)
|
||||
|
||||
action: "Format" = editor-format (source)
|
||||
action: "Show parsed AST" = debug-show-aterm (source)
|
||||
|
||||
views
|
||||
|
||||
outline view: editor-outline (source)
|
||||
expand to level: 3
|
||||
937
IBAF-Editor/lib/StrategoMix.def
Normal file
937
IBAF-Editor/lib/StrategoMix.def
Normal file
@@ -0,0 +1,937 @@
|
||||
definition
|
||||
module Stratego-Sugar-Overlays
|
||||
imports
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Sugar-Terms
|
||||
|
||||
exports
|
||||
sorts Overlay
|
||||
context-free syntax
|
||||
Id "=" Term -> Overlay {cons("OverlayNoArgs")}
|
||||
Id "(" {Id ","}* ")" "=" Term -> Overlay {cons("Overlay")}
|
||||
|
||||
module Stratego-Sugar-DynamicRules
|
||||
imports
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Sugar-Strategies
|
||||
Stratego-Sugar-Rules
|
||||
|
||||
exports
|
||||
|
||||
sorts ScopeLabels
|
||||
context-free syntax
|
||||
|
||||
"{|" ScopeLabels ":" Strategy "|}" -> Strategy {cons("DynRuleScope")}
|
||||
|
||||
{DynRuleScopeId ","}* -> ScopeLabels
|
||||
"~" Term -> ScopeLabels {cons("ScopeLabels")}
|
||||
|
||||
sorts DynRuleDef DynRuleId DynRuleScopeId RuleDec
|
||||
context-free syntax
|
||||
|
||||
"rules" "(" DynRuleDef* ")" -> Strategy {cons("GenDynRules")}
|
||||
|
||||
Id "+" Term -> DynRuleDef {cons("AddScopeLabel")}
|
||||
DynRuleId ":-" Term -> DynRuleDef {cons("UndefineDynRule")}
|
||||
DynRuleId ":" Rule -> DynRuleDef {cons("SetDynRule")}
|
||||
DynRuleId ":+" Rule -> DynRuleDef {cons("AddDynRule")}
|
||||
DynRuleId ":" Term -> DynRuleDef {cons("SetDynRuleMatch")}
|
||||
|
||||
DynRuleId ":=" Term -> DynRuleDef {cons("DynRuleAssign")}
|
||||
DynRuleId ":+=" Term -> DynRuleDef {cons("DynRuleAssignAdd")}
|
||||
|
||||
DynRuleId ":" Rule "depends" "on" Term -> DynRuleDef {cons("SetDynRuleDepends")}
|
||||
|
||||
RuleDec "." Term -> DynRuleId {cons("LabeledDynRuleId")}
|
||||
RuleDec "+" Term -> DynRuleId {cons("AddLabelDynRuleId")}
|
||||
RuleDec -> DynRuleId {cons("DynRuleId")}
|
||||
|
||||
Id "." Term -> DynRuleScopeId {cons("LabeledDynRuleScopeId")}
|
||||
Id -> DynRuleScopeId {cons("DynRuleScopeId")}
|
||||
|
||||
context-free syntax
|
||||
|
||||
Id -> RuleDec {cons("RDecNoArgs")}
|
||||
Id "(" {Typedid ","}* ")" -> RuleDec {cons("RDec")}
|
||||
Id "(" {Typedid ","}*
|
||||
"|" {Typedid ","}* ")" -> RuleDec {cons("RDecT")}
|
||||
|
||||
sorts RuleNames
|
||||
context-free syntax
|
||||
{Id ","}* -> RuleNames
|
||||
"~" Term -> RuleNames {cons("RuleNames")}
|
||||
|
||||
"/" RuleNames "\\*" Strategy -> Strategy {cons("DynRuleIntersectFix")}
|
||||
|
||||
syntax
|
||||
%% no space after RuleNames
|
||||
"\\" <LAYOUT?-CF> <RuleNames-CF> "/*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleUnionFix")}
|
||||
|
||||
%% 1 space after RuleNames
|
||||
"\\" <LAYOUT?-CF> <RuleNames-CF> " /*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleUnionFix")}
|
||||
|
||||
%% no space after RuleNames
|
||||
"/" <LAYOUT?-CF> <RuleNames-CF> <LAYOUT?-CF> "\\"
|
||||
<LAYOUT?-CF> <RuleNames-CF> "/*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleIntersectUnionFix")}
|
||||
|
||||
%% 1 space after RuleNames
|
||||
"/" <LAYOUT?-CF> <RuleNames-CF> <LAYOUT?-CF> "\\"
|
||||
<LAYOUT?-CF> <RuleNames-CF> " /*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleIntersectUnionFix")}
|
||||
|
||||
|
||||
context-free syntax
|
||||
Strategy "/" RuleNames"\\" Strategy -> Strategy {cons("DynRuleIntersect"),right}
|
||||
Strategy "\\" RuleNames "/" Strategy -> Strategy {cons("DynRuleUnion"),right}
|
||||
|
||||
Strategy "/" RuleNames "\\"
|
||||
RuleNames "/" Strategy -> Strategy {cons("DynRuleIntersectUnion"),right}
|
||||
|
||||
priorities
|
||||
<StrategyAngle-CF> <LAYOUT?-CF> <Term-CF> -> <Strategy-CF> {cons("BA")}
|
||||
> {
|
||||
|
||||
%% no space after RuleNames
|
||||
"\\" <LAYOUT?-CF> <RuleNames-CF> "/*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleUnionFix")}
|
||||
|
||||
%% 1 space after RuleNames
|
||||
"\\" <LAYOUT?-CF> <RuleNames-CF> " /*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleUnionFix")}
|
||||
|
||||
%% no space after RuleNames
|
||||
"/" <LAYOUT?-CF> <RuleNames-CF> <LAYOUT?-CF> "\\"
|
||||
<LAYOUT?-CF> <RuleNames-CF> "/*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleIntersectUnionFix")}
|
||||
|
||||
%% 1 space after RuleNames
|
||||
"/" <LAYOUT?-CF> <RuleNames-CF> <LAYOUT?-CF> "\\"
|
||||
<LAYOUT?-CF> <RuleNames-CF> " /*" <LAYOUT?-CF> <Strategy-CF>
|
||||
-> <Strategy-CF> {cons("DynRuleIntersectUnionFix")}
|
||||
|
||||
}
|
||||
> <Strategy-CF> <LAYOUT?-CF> "=>" <LAYOUT?-CF> <Term-CF> -> <Strategy-CF> {cons("AM")}
|
||||
|
||||
context-free priorities
|
||||
StrategyAngle Term -> Strategy {cons("BA")}
|
||||
> "/" RuleNames "\\*" Strategy -> Strategy {cons("DynRuleIntersectFix")}
|
||||
> Strategy "=>" Term -> Strategy {cons("AM")}
|
||||
> Strategy "/" RuleNames "\\" Strategy -> Strategy {cons("DynRuleIntersect"),right}
|
||||
> Strategy "\\" RuleNames "/" Strategy -> Strategy {cons("DynRuleUnion"),right}
|
||||
> Strategy "/" RuleNames "\\"
|
||||
RuleNames "/" Strategy -> Strategy {cons("DynRuleIntersectUnion"),right}
|
||||
> Strategy ";" Strategy -> Strategy {cons("Seq"),right}
|
||||
|
||||
module Stratego-Sugar-Rules
|
||||
imports Stratego-Sugar-Strategies
|
||||
exports
|
||||
|
||||
sorts RuleDef
|
||||
context-free syntax
|
||||
Id ":" Rule -> RuleDef {cons("RDefNoArgs")}
|
||||
|
||||
Anno+ RuleDef -> Def {cons("AnnoDef")}
|
||||
|
||||
Id "(" {Typedid ","}* ")" ":" Rule -> RuleDef {cons("RDef")}
|
||||
|
||||
Id "(" {Typedid ","}*
|
||||
"|" {Typedid ","}* ")" ":" Rule -> RuleDef {cons("RDefT")}
|
||||
|
||||
%% Rule definition with pattern matched term parameters
|
||||
Id "(" {Typedid ","}*
|
||||
"|" {Term ","}* ")" ":" Rule -> RuleDef {cons("RDefP"), avoid}
|
||||
|
||||
sorts Rule RuleCond
|
||||
context-free syntax
|
||||
Term "->" Term -> Rule {cons("RuleNoCond")} %% backward comp.
|
||||
Term "->" Term "where" Strategy -> Rule {cons("Rule")} %% backward comp.
|
||||
Term "->" Term RuleCond+ -> Rule {cons("Rule"), avoid}
|
||||
|
||||
"where" Strategy -> RuleCond {cons("WhereClause")}
|
||||
"with" Strategy -> RuleCond {cons("WithClause")}
|
||||
|
||||
module Stratego-Sugar-Strategies
|
||||
imports
|
||||
Stratego-Core-Strategies
|
||||
Stratego-Sugar-Terms
|
||||
Stratego-Sugar-Constants
|
||||
Stratego-Sugar-Signatures
|
||||
|
||||
exports
|
||||
context-free syntax
|
||||
Id "=" Strategy -> StrategyDef {cons("SDefNoArgs")}
|
||||
Id "(" {Typedid ","}* ")" "=" Strategy -> StrategyDef {cons("SDef")}
|
||||
|
||||
%% Strategy definition with pattern matched term parameters
|
||||
Id "(" {Typedid ","}* "|" {Term ","}* ")" "=" Strategy -> StrategyDef {cons("SDefP"), avoid}
|
||||
|
||||
context-free syntax
|
||||
ID -> Typedid {cons("DefaultVarDec")}
|
||||
|
||||
sorts Rule
|
||||
|
||||
sorts StrategyParen StrategyCurly StrategyAngle
|
||||
context-free syntax
|
||||
|
||||
%% Abstraction
|
||||
|
||||
SVar "(" {Strategy ","}* ")" -> Strategy {cons("Call")}
|
||||
|
||||
%% Match and build
|
||||
|
||||
"{" Strategy "}" -> Strategy {cons("ScopeDefault")}
|
||||
|
||||
%%"<" Strategy ">" Term -> Strategy {cons("BA")}
|
||||
StrategyAngle Term -> Strategy {cons("BA")}
|
||||
"<" Strategy ">" -> StrategyAngle {bracket} %% {cons("AngleStrat")}
|
||||
|
||||
%% Combinators
|
||||
|
||||
Strategy "<+" Strategy -> Strategy {cons("LChoice"),right}
|
||||
|
||||
"rec" Id "(" Strategy ")" -> Strategy {cons("Rec")}
|
||||
|
||||
"not" "(" Strategy ")" -> Strategy {cons("Not")}
|
||||
"where" "(" Strategy ")" -> Strategy {cons("Where")}
|
||||
"with" "(" Strategy ")" -> Strategy {cons("With"), prefer}
|
||||
"test" "(" Strategy ")" -> Strategy {cons("Test")}
|
||||
|
||||
%% Primitives
|
||||
|
||||
"prim" "(" String ")" -> Strategy {cons("PrimNoArgs")}
|
||||
"prim" "(" String "," {Term ","}* ")" -> Strategy {cons("Prim")}
|
||||
|
||||
%% Congruence operators
|
||||
|
||||
String -> Strategy {cons("StrCong")}
|
||||
Int -> Strategy {cons("IntCong")}
|
||||
Real -> Strategy {cons("RealCong")}
|
||||
Char -> Strategy {cons("CharCong")}
|
||||
|
||||
String "(" {Strategy ","}* ")" -> Strategy {cons("CongQ")}
|
||||
|
||||
%%"(" {Strategy ","}* ")" -> Strategy {cons("TupleCong"),avoid}
|
||||
|
||||
Strategy StrategyCurly -> Strategy {cons("AnnoCong")}
|
||||
|
||||
"{" Strategy "}" -> StrategyCurly {cons("StrategyCurly")}
|
||||
|
||||
"(" ")" -> Strategy {cons("EmptyTupleCong")}
|
||||
"(" Strategy ")" -> Strategy {bracket}
|
||||
"(" Strategy "," {Strategy ","}+ ")" -> Strategy {cons("TupleCong")}
|
||||
|
||||
%% Mod -> Strategy {cons("ModCongNoArgs")}
|
||||
%% Mod "(" {Strategy ","}* ")" -> Strategy {cons("ModCong")}
|
||||
%% Id "^" Id -> Mod {cons("Mod")}
|
||||
"[" {Strategy ","}* "]" -> Strategy {cons("ListCongNoTail")}
|
||||
"[" {Strategy ","}* "|" Strategy "]" -> Strategy {cons("ListCong")}
|
||||
|
||||
%% Strategy "#" "(" StrategyInj ")" -> Strategy {cons("ExplodeCong")}
|
||||
%% Strategy "#" "(" Strategy ")" -> Strategy {cons("ExplodeCong")}
|
||||
Strategy "#" StrategyParen -> Strategy {cons("ExplodeCong")}
|
||||
|
||||
%% Syntactic sugar sugar
|
||||
|
||||
sorts SwitchCase
|
||||
context-free syntax
|
||||
|
||||
SVar -> Strategy {cons("CallNoArgs")}
|
||||
"\\" Rule "\\" -> Strategy {cons("LRule")}
|
||||
"(" Rule ")" -> Strategy {cons("SRule")}
|
||||
Strategy "+" Strategy -> Strategy {cons("Choice"),right}
|
||||
Strategy "+>" Strategy -> Strategy {cons("RChoice"),right}
|
||||
|
||||
"proceed" "(" {Strategy "," }+ ")" -> Strategy {cons("Proceed"), prefer}
|
||||
|
||||
"if" Strategy "then" Strategy
|
||||
"else" Strategy "end" -> Strategy {cons("CondChoice")}
|
||||
"if" Strategy "then" Strategy "end" -> Strategy {cons("IfThen")}
|
||||
|
||||
"switch" Strategy SwitchCase* "end" -> Strategy {cons("SwitchChoiceNoOtherwise")}
|
||||
"switch" Strategy SwitchCase*
|
||||
"otherwise" ":" Strategy "end" -> Strategy {cons("SwitchChoice")}
|
||||
|
||||
"case" Strategy ":" Strategy -> SwitchCase {cons("SwitchCase")}
|
||||
|
||||
Strategy "=>" Term -> Strategy {cons("AM")}
|
||||
|
||||
Term ":=" Term -> Strategy {cons("Assign")}
|
||||
|
||||
%% Priorities
|
||||
|
||||
context-free priorities
|
||||
{ Strategy StrategyCurly -> Strategy
|
||||
Strategy "#" StrategyParen -> Strategy
|
||||
}
|
||||
> { "!" Term -> Strategy
|
||||
"?" Term -> Strategy
|
||||
}
|
||||
> StrategyAngle Term -> Strategy
|
||||
> Strategy "=>" Term -> Strategy
|
||||
> Strategy ";" Strategy -> Strategy
|
||||
> {right:
|
||||
Strategy "+" Strategy -> Strategy
|
||||
Strategy "<+" Strategy -> Strategy
|
||||
Strategy "+>" Strategy -> Strategy
|
||||
|
||||
Strategy "<" StrategyMid
|
||||
"+" Strategy -> Strategy
|
||||
}
|
||||
|
||||
context-free priorities
|
||||
Strategy -> StrategyMid
|
||||
> Strategy "+" Strategy -> Strategy
|
||||
|
||||
context-free priorities
|
||||
{ Strategy StrategyCurly -> Strategy
|
||||
Strategy "#" StrategyParen -> Strategy
|
||||
}
|
||||
.> Term ":=" Term -> Strategy
|
||||
|
||||
|
||||
module Stratego-Sugar-Terms
|
||||
imports
|
||||
Stratego-Core-Terms
|
||||
Stratego-Sugar-Strategies
|
||||
|
||||
exports
|
||||
sorts LID
|
||||
context-free syntax
|
||||
LId -> LID {cons("ListVar")}
|
||||
LID -> Var {cons("Var")}
|
||||
LID -> ID
|
||||
|
||||
context-free syntax
|
||||
"_" PreTerm -> PreTerm {cons("BuildDefaultPT")}
|
||||
"_" Term -> Term {cons("BuildDefault"),prefer}
|
||||
|
||||
Char -> PreTerm {cons("Char")}
|
||||
|
||||
PreTerm "{" {Term ","}* "}" -> Term {cons("AnnoList")}
|
||||
PreTerm -> Term {cons("NoAnnoList")}
|
||||
|
||||
"<" Strategy ">" Term -> PreTerm {cons("App")}
|
||||
"<" Strategy ">" Term -> Term {cons("App"),prefer}
|
||||
|
||||
StrategyAngle -> PreTerm {cons("RootApp")}
|
||||
StrategyAngle -> Term {cons("RootApp"),prefer}
|
||||
|
||||
"(" {Term ","}* ")" -> PreTerm {cons("Tuple")}
|
||||
"[" {Term ","}* "]" -> PreTerm {cons("List")}
|
||||
"[" {Term ","}* "|" Term "]" -> PreTerm {cons("ListTail")}
|
||||
|
||||
context-free priorities
|
||||
Term "#" "(" Term ")" -> PreTerm {cons("Explode")}
|
||||
> PreTerm "{" {Term ","}* "}" -> Term {cons("AnnoList")}
|
||||
> Var "@" Term -> Term {cons("As")}
|
||||
|
||||
module Stratego-Sugar-Signatures
|
||||
imports
|
||||
Stratego-Core-Signatures
|
||||
Stratego-Sugar-Constants
|
||||
|
||||
exports
|
||||
|
||||
sorts Sort
|
||||
context-free syntax
|
||||
"[" {Sort ","}* "]" -> Sort {cons("SortList")}
|
||||
"[" {Sort ","}* "|" Sort "]" -> Sort {cons("SortListTl")}
|
||||
"(" {Sort ","}* ")" -> Sort {cons("SortTuple")}
|
||||
|
||||
sorts Kind
|
||||
context-free syntax
|
||||
"*" -> Kind {cons("Star")}
|
||||
"**" -> Kind {cons("StarStar")}
|
||||
|
||||
module Stratego-Core-Signatures
|
||||
imports
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Core-Constants
|
||||
exports
|
||||
sorts Sdecl
|
||||
context-free syntax
|
||||
"sorts" Sort* -> Sdecl {cons("Sorts")}
|
||||
"constructors" Opdecl* -> Sdecl {cons("Constructors")}
|
||||
|
||||
sorts Sort
|
||||
context-free syntax
|
||||
LCID -> Sort {cons("SortVar")}
|
||||
UCID -> Sort {cons("SortNoArgs")}
|
||||
Id "(" {Sort ","}* ")" -> Sort {cons("Sort")}
|
||||
|
||||
sorts Opdecl
|
||||
context-free syntax
|
||||
Id ":" Type -> Opdecl {cons("OpDecl")}
|
||||
String ":" Type -> Opdecl {cons("OpDeclQ")}
|
||||
":" Type -> Opdecl {cons("OpDeclInj")}
|
||||
|
||||
context-free syntax
|
||||
"external" Id ":" Type -> Opdecl {cons("ExtOpDecl")}
|
||||
"external" String ":" Type -> Opdecl {cons("ExtOpDeclQ")}
|
||||
"external" ":" Type -> Opdecl {cons("ExtOpDeclInj")}
|
||||
|
||||
sorts Type ArgType ConstType FunType RetType
|
||||
context-free syntax
|
||||
Sort -> ConstType {cons("ConstType")}
|
||||
{ArgType "*"}+ "->" RetType -> FunType {cons("FunType")}
|
||||
"(" Type ")" -> ArgType {bracket}
|
||||
ConstType -> ArgType
|
||||
Type -> RetType
|
||||
FunType -> RetType {reject}
|
||||
|
||||
FunType -> Type
|
||||
ConstType -> Type
|
||||
|
||||
%%%
|
||||
%% Restriction is required for the Sort* in Sdecl: List(a) is
|
||||
%% ambiguous.
|
||||
%%%
|
||||
context-free restrictions
|
||||
Sort -/- [\(]
|
||||
|
||||
module Stratego-Core-Terms
|
||||
imports
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Core-Constants
|
||||
|
||||
exports
|
||||
sorts ID Var Wld
|
||||
context-free syntax
|
||||
Id -> Var {cons("Var")}
|
||||
Id -> ID
|
||||
%% ":" Var -> Var {cons("SeqVar")}
|
||||
|
||||
sorts Term PreTerm
|
||||
context-free syntax
|
||||
Var -> PreTerm
|
||||
Var -> Term {prefer}
|
||||
|
||||
"_" -> Wld {cons("Wld")}
|
||||
Wld -> PreTerm
|
||||
Wld -> Term {prefer}
|
||||
|
||||
Int -> PreTerm {cons("Int")}
|
||||
Real -> PreTerm {cons("Real")}
|
||||
String -> PreTerm {cons("Str")}
|
||||
|
||||
Id "(" {Term ","}* ")" -> PreTerm {cons("Op")}
|
||||
String "(" {Term ","}* ")" -> PreTerm {cons("OpQ")}
|
||||
Term "#" "(" Term ")" -> PreTerm {cons("Explode")}
|
||||
|
||||
PreTerm "{^" PreTerm "}" -> Term {cons("Anno")}
|
||||
|
||||
Var "@" Term -> Term {cons("As"),prefer}
|
||||
Var "@" PreTerm -> PreTerm {cons("As")}
|
||||
|
||||
context-free priorities
|
||||
Term "#" "(" Term ")" -> PreTerm {cons("Explode")}
|
||||
> Var "@" Term -> Term {cons("As")}
|
||||
|
||||
module Stratego-Core-Strategies
|
||||
imports
|
||||
Stratego-Core-Terms
|
||||
Stratego-Core-Constants
|
||||
Stratego-Core-Signatures
|
||||
|
||||
exports
|
||||
sorts Def
|
||||
context-free syntax
|
||||
StrategyDef -> Def
|
||||
Id -> SVar {cons("SVar")}
|
||||
"let" Def* "in" Strategy "end" -> Strategy {cons("Let")}
|
||||
SVar "(" {Strategy ","}* "|" {Term ","}* ")" -> Strategy {cons("CallT")}
|
||||
|
||||
"call" "(" Term "|" {Strategy ","}* "|" {Term ","}* ")" -> Strategy {cons("CallDynamic")}
|
||||
|
||||
|
||||
sorts StrategyDef
|
||||
context-free syntax
|
||||
Id "(" {Typedid ","}*
|
||||
"|" {Typedid ","}* ")" "=" Strategy -> StrategyDef {cons("SDefT")}
|
||||
|
||||
Anno+ StrategyDef -> Def {cons("AnnoDef")}
|
||||
|
||||
"external"
|
||||
Id "(" {Typedid ","}*
|
||||
"|" {Typedid ","}* ")" "=" Strategy -> StrategyDef {cons("ExtSDefInl")}
|
||||
|
||||
"external"
|
||||
Id "(" {Typedid ","}*
|
||||
"|" {Typedid ","}* ")" -> StrategyDef {cons("ExtSDef")}
|
||||
|
||||
"external"
|
||||
EmptyId "(" {Typedid ","}*
|
||||
"|" {Typedid ","}* ")" -> StrategyDef {cons("ExtSDef")}
|
||||
|
||||
|
||||
sorts EmptyId
|
||||
lexical syntax
|
||||
|
||||
-> EmptyId
|
||||
|
||||
sorts Anno
|
||||
context-free syntax
|
||||
"extend" -> Anno {cons("Extend")}
|
||||
"override" -> Anno {cons("Override")}
|
||||
"internal" -> Anno {cons("Internal")}
|
||||
%% "sealed" -> Anno {cons("Sealed")}
|
||||
%% "extensible" -> Anno {cons("Extensible")}
|
||||
%% "overridable" -> Anno {cons("Overridable")}
|
||||
|
||||
lexical syntax
|
||||
|
||||
"extend" -> Keyword
|
||||
"override" -> Keyword
|
||||
"internal" -> Keyword
|
||||
"sealed" -> Keyword
|
||||
"extensible" -> Keyword
|
||||
"overridable" -> Keyword
|
||||
|
||||
lexical restrictions
|
||||
|
||||
"extend"
|
||||
"override"
|
||||
"internal"
|
||||
"sealed"
|
||||
"extensible"
|
||||
"overridable" -/- [a-zA-Z0-9\'\-\_]
|
||||
|
||||
sorts Typedid
|
||||
context-free syntax
|
||||
ID ":" Type -> Typedid {cons("VarDec")}
|
||||
|
||||
|
||||
sorts Strategy SVar StrategyParen StrategyMid
|
||||
context-free syntax
|
||||
"(" Strategy ")" -> StrategyParen {cons("ParenStrat")}
|
||||
|
||||
"fail" -> Strategy {cons("Fail")}
|
||||
"id" -> Strategy {cons("Id")}
|
||||
|
||||
"proceed" "(" {Strategy ","}* "|" {Term ","}* ")" -> Strategy {cons("ProceedT"), prefer}
|
||||
"proceed" -> Strategy {cons("ProceedNoArgs"), prefer}
|
||||
|
||||
%% Match and build
|
||||
|
||||
"?" Term -> Strategy {cons("Match")}
|
||||
"!" Term -> Strategy {cons("Build")}
|
||||
"{" {ID ","}* ":" Strategy "}" -> Strategy {cons("Scope")}
|
||||
|
||||
%% Combinators
|
||||
|
||||
Strategy ";" Strategy -> Strategy {cons("Seq"),right}
|
||||
Strategy "<" StrategyMid
|
||||
"+" Strategy -> Strategy {cons("GuardedLChoice"),right}
|
||||
Strategy -> StrategyMid
|
||||
|
||||
%% Primitives
|
||||
|
||||
"prim" "(" String "," {Strategy ","}* "|" {Term ","}*")" -> Strategy {cons("PrimT")}
|
||||
|
||||
%% Traversal
|
||||
|
||||
"some" "(" Strategy ")" -> Strategy {cons("Some")}
|
||||
"one" "(" Strategy ")" -> Strategy {cons("One")}
|
||||
"all" "(" Strategy ")" -> Strategy {cons("All")}
|
||||
|
||||
%% Priorities
|
||||
|
||||
context-free priorities
|
||||
{ "!" Term -> Strategy {cons("Build")}
|
||||
"?" Term -> Strategy {cons("Match")}
|
||||
}
|
||||
> Strategy ";" Strategy -> Strategy {cons("Seq"),right}
|
||||
> {right:
|
||||
Strategy "<" StrategyMid
|
||||
"+" Strategy -> Strategy {cons("GuardedLChoice"),right}
|
||||
}
|
||||
|
||||
context-free syntax
|
||||
"import-term" "(" ModName ")" -> Strategy {cons("ImportTerm")}
|
||||
|
||||
module Stratego-Core-Modules
|
||||
imports
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Core-Strategies
|
||||
Stratego-Core-Signatures
|
||||
|
||||
exports
|
||||
sorts Module
|
||||
context-free syntax
|
||||
"module" ModName Decl* -> Module {cons("Module")}
|
||||
"specification" Decl* -> Module {cons("Specification")}
|
||||
|
||||
sorts Decl
|
||||
context-free syntax
|
||||
"imports" ImportModName* -> Decl {cons("Imports")}
|
||||
"strategies" Def* -> Decl {cons("Strategies")}
|
||||
"signature" Sdecl* -> Decl {cons("Signature")}
|
||||
|
||||
sorts ImportModName
|
||||
context-free syntax
|
||||
ModName -> ImportModName {cons("Import")}
|
||||
syntax
|
||||
<ModName-CF> "/" "-" -> <ImportModName-CF> {cons("ImportWildcard")}
|
||||
|
||||
module Stratego-Sugar-Modules
|
||||
imports
|
||||
Stratego-Core-Modules
|
||||
Stratego-Sugar-Strategies
|
||||
Stratego-Sugar-Signatures
|
||||
Stratego-Sugar-Overlays
|
||||
Stratego-Sugar-Rules
|
||||
|
||||
exports
|
||||
|
||||
sorts Decl Def
|
||||
context-free syntax
|
||||
"rules" Def* -> Decl {cons("Rules")}
|
||||
"overlays" Overlay* -> Decl {cons("Overlays")}
|
||||
|
||||
RuleDef -> Def
|
||||
|
||||
|
||||
module Stratego-Sugar-StringQuotations
|
||||
exports
|
||||
|
||||
sorts
|
||||
StringQuotation
|
||||
StringQuotedPart1 StringQuotedChars1 DollarOpen1 DollarClose1 QuotedBracket1 Dollar1
|
||||
StringQuotedPart2 StringQuotedChars2 DollarOpen2 DollarClose2 QuotedBracket2 Dollar2
|
||||
StringQuotedPart3 StringQuotedChars3 DollarOpen3 DollarClose3 QuotedBracket3 Dollar3
|
||||
StringQuotedPart4 StringQuotedChars4 DollarOpen4 DollarClose4 QuotedBracket4 Dollar4
|
||||
Padding
|
||||
|
||||
context-free syntax
|
||||
|
||||
StringQuotation -> PreTerm
|
||||
|
||||
syntax
|
||||
|
||||
StringQuotation -> <PreTerm-CF>
|
||||
|
||||
"$" "[" Padding StringQuotedPart1* "]" -> StringQuotation {cons("StringQuotation1") }
|
||||
Padding "[" <LAYOUT?-CF> <Term-CF> <LAYOUT?-CF> "]" -> StringQuotedPart1 {cons("StringEscape1")}
|
||||
<StringQuotedChars1-LEX> -> StringQuotedPart1 {cons("QStr")}
|
||||
<Dollar1-LEX> -> StringQuotedPart1 {cons("QDollar")}
|
||||
"$" <QuotedBracket1-LEX> "$" -> StringQuotedPart1 {cons("QBr")}
|
||||
~[\[\]\$]+ -> <StringQuotedChars1-LEX>
|
||||
[\[\]] -> <QuotedBracket1-LEX>
|
||||
"$" -> <Dollar1-LEX>
|
||||
|
||||
"$" "{" Padding StringQuotedPart2* "}" -> StringQuotation {cons("StringQuotation2") }
|
||||
Padding "{" <LAYOUT?-CF> <Term-CF> <LAYOUT?-CF> "}" -> StringQuotedPart2 {cons("StringEscape2")}
|
||||
<StringQuotedChars2-LEX> -> StringQuotedPart2 {cons("QStr")}
|
||||
<Dollar2-LEX> -> StringQuotedPart2 {cons("QDollar")}
|
||||
"$" <QuotedBracket2-LEX> "$" -> StringQuotedPart2 {cons("QBr")}
|
||||
~[\{\}\$]+ -> <StringQuotedChars2-LEX>
|
||||
[\{\}] -> <QuotedBracket2-LEX>
|
||||
"$" -> <Dollar2-LEX>
|
||||
|
||||
"$" "(" Padding StringQuotedPart3* ")" -> StringQuotation {cons("StringQuotation3") }
|
||||
Padding "(" <LAYOUT?-CF> <Term-CF> <LAYOUT?-CF> ")" -> StringQuotedPart3 {cons("StringEscape3")}
|
||||
<StringQuotedChars3-LEX> -> StringQuotedPart3 {cons("QStr")}
|
||||
<Dollar3-LEX> -> StringQuotedPart3 {cons("QDollar")}
|
||||
"$" <QuotedBracket3-LEX> "$" -> StringQuotedPart3 {cons("QBr")}
|
||||
~[\(\)\$]+ -> <StringQuotedChars3-LEX>
|
||||
[\(\)] -> <QuotedBracket3-LEX>
|
||||
"$" -> <Dollar3-LEX>
|
||||
|
||||
"$" "<" Padding StringQuotedPart4* ">" -> StringQuotation {cons("StringQuotation4") }
|
||||
Padding "<" <LAYOUT?-CF> <Term-CF> <LAYOUT?-CF> ">" -> StringQuotedPart4 {cons("StringEscape4")}
|
||||
<StringQuotedChars4-LEX> -> StringQuotedPart4 {cons("QStr")}
|
||||
<Dollar4-LEX> -> StringQuotedPart4 {cons("QDollar")}
|
||||
"$" <QuotedBracket4-LEX> "$" -> StringQuotedPart4 {cons("QBr")}
|
||||
~[\<\>\$]+ -> <StringQuotedChars4-LEX>
|
||||
[\<\>] -> <QuotedBracket4-LEX>
|
||||
"$" -> <Dollar4-LEX>
|
||||
|
||||
%% Padding is a dummy lexical that will contain the indentation prefix of every quotation
|
||||
<Padding-LEX> -> Padding
|
||||
-> <Padding-LEX> {indentpadding}
|
||||
|
||||
lexical restrictions
|
||||
|
||||
StringQuotedChars1 -/- ~[\[\]\$]
|
||||
StringQuotedChars2 -/- ~[\{\}\$]
|
||||
StringQuotedChars3 -/- ~[\(\)\$]
|
||||
StringQuotedChars4 -/- ~[\<\>\$]
|
||||
Dollar1 -/- [\[\]] . [\$]
|
||||
Dollar2 -/- [\{\}] . [\$]
|
||||
Dollar3 -/- [\(\)] . [\$]
|
||||
Dollar4 -/- [\<\>] . [\$]
|
||||
|
||||
module Stratego-Core-Constants
|
||||
exports
|
||||
sorts Int Real String StrChar
|
||||
lexical syntax
|
||||
[\-]? [0-9]+ -> Int
|
||||
[\-]? [0-9]+ [\.] [0-9]+ -> Real
|
||||
"\"" StrChar* "\"" -> String
|
||||
~[\"\\] -> StrChar
|
||||
[\\] [\"tnr\\] -> StrChar
|
||||
|
||||
|
||||
module Stratego-Sugar-Constants
|
||||
imports
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Core-Constants
|
||||
Stratego-Sugar-StringQuotations
|
||||
exports
|
||||
sorts Char CharChar
|
||||
lexical syntax
|
||||
"'" CharChar "'" -> Char
|
||||
~[\'] -> CharChar
|
||||
[\\] [\'ntr\ ] -> CharChar
|
||||
Char -> Id {reject}
|
||||
|
||||
module Stratego-Core-Identifiers
|
||||
exports
|
||||
sorts ModName ModNamePart
|
||||
lexical syntax
|
||||
{ModNamePart "/"}+ -> ModName
|
||||
[a-zA-Z\.\_] [a-zA-Z0-9\'\.\-\_]* -> ModNamePart
|
||||
lexical restrictions
|
||||
ModName -/- [a-zA-Z0-9\'\.\-\_]
|
||||
lexical syntax
|
||||
"imports" -> ModName {reject}
|
||||
"overlays" -> ModName {reject}
|
||||
"rules" -> ModName {reject}
|
||||
"signature" -> ModName {reject}
|
||||
"strategies" -> ModName {reject}
|
||||
|
||||
sorts Id LId LCID UCID Wld
|
||||
lexical syntax
|
||||
[a-zA-Z\_] [a-zA-Z0-9\'\-\_]* -> Id
|
||||
[a-zA-Z\_] [a-zA-Z0-9\'\-\_]* "*" -> LId
|
||||
[\'] [a-z]+ -> Id
|
||||
|
||||
[a-z] [a-zA-Z0-9\'\-\_]* -> LCID
|
||||
[A-Z] [a-zA-Z0-9\'\-\_]* -> UCID
|
||||
|
||||
lexical restrictions
|
||||
Id -/- [a-zA-Z0-9\'\_\*]
|
||||
Id -/- [\-].~[\>]
|
||||
LId -/- [a-zA-Z0-9\'\-\_]
|
||||
LCID -/- [a-zA-Z0-9\'\-\_]
|
||||
UCID -/- [a-zA-Z0-9\'\-\_]
|
||||
|
||||
lexical syntax
|
||||
"_" -> Id {reject}
|
||||
"'" -> Id {reject}
|
||||
|
||||
Keyword -> Id {reject}
|
||||
Keyword -> LId {reject}
|
||||
Keyword -> LCID {reject}
|
||||
Keyword -> UCID {reject}
|
||||
|
||||
lexical restrictions
|
||||
"all"
|
||||
"case" %% not reserved kw
|
||||
"constructors"
|
||||
"else" %% not reserved kw
|
||||
"end" %% not reserved kw
|
||||
"external" %% not reserved kw
|
||||
"fail"
|
||||
"id"
|
||||
"if" %% not reserved kw
|
||||
"in"
|
||||
"imports" %% not reserved kw
|
||||
"let"
|
||||
"module"
|
||||
"not"
|
||||
"one"
|
||||
"overlays"
|
||||
"otherwise" %% not reserved kw
|
||||
"prim"
|
||||
"rec" %% not reserved kw
|
||||
"rules"
|
||||
"script"
|
||||
"signature"
|
||||
"some"
|
||||
"sorts"
|
||||
"strategies"
|
||||
"stratego"
|
||||
"switch" %% not reserved kw
|
||||
"test"
|
||||
"then" %% not reserved kw
|
||||
"where"
|
||||
"import-term"
|
||||
-/- [a-zA-Z0-9\'\-\_]
|
||||
|
||||
context-free restrictions
|
||||
Wld -/- [a-zA-Z0-9\'\-\_]
|
||||
|
||||
sorts Keyword
|
||||
lexical syntax
|
||||
"all" -> Keyword
|
||||
"constructors" -> Keyword
|
||||
"fail" -> Keyword
|
||||
"id" -> Keyword
|
||||
"in" -> Keyword
|
||||
"let" -> Keyword
|
||||
"module" -> Keyword
|
||||
"not" -> Keyword
|
||||
"one" -> Keyword
|
||||
"overlays" -> Keyword
|
||||
"prim" -> Keyword
|
||||
"rules" -> Keyword
|
||||
"script" -> Keyword
|
||||
"signature" -> Keyword
|
||||
"some" -> Keyword
|
||||
"sorts" -> Keyword
|
||||
"strategies" -> Keyword
|
||||
"stratego" -> Keyword
|
||||
"test" -> Keyword
|
||||
"where" -> Keyword
|
||||
"import-term" -> Keyword
|
||||
|
||||
|
||||
module Stratego-Core-Layout
|
||||
exports
|
||||
sorts Ws ShortCom LongCom CommChar Asterisk Eof
|
||||
lexical syntax
|
||||
[\t\ \n\r] -> Ws
|
||||
|
||||
"//" ~[\n]* ([\n] | Eof) -> ShortCom
|
||||
"/*" CommChar* "*/" -> LongCom
|
||||
-> Eof
|
||||
|
||||
~[\*] -> CommChar
|
||||
|
||||
"*" -> Asterisk
|
||||
Asterisk -> CommChar
|
||||
|
||||
lexical restrictions
|
||||
Asterisk -/- [\/]
|
||||
Eof -/- ~[]
|
||||
|
||||
lexical syntax
|
||||
ShortCom -> LAYOUT
|
||||
LongCom -> LAYOUT
|
||||
Ws -> LAYOUT
|
||||
|
||||
context-free restrictions
|
||||
LAYOUT? -/- [\ \t\n\r]
|
||||
LAYOUT? -/- [\/].[\*]
|
||||
LAYOUT? -/- [\/].[\/]
|
||||
|
||||
module Stratego-Sugar-Layout
|
||||
imports Stratego-Core-Layout
|
||||
%%exports
|
||||
%% sorts VeryLongCom Eof VLCchar Backslash
|
||||
%% lexical syntax
|
||||
%% "\\end{code}" VLCchar* "\\begin{code}" -> VeryLongCom
|
||||
%% "\\begin{code}" -> VeryLongCom
|
||||
%% "\\end{code}" VLCchar* Eof -> VeryLongCom
|
||||
%% "\\literate" VLCchar* "\\begin{code}" -> VeryLongCom
|
||||
%% ~[\\] -> VLCchar
|
||||
%% Backslash -> VLCchar
|
||||
%% [\\] -> Backslash
|
||||
|
||||
%% lexical restrictions
|
||||
%% Backslash -/- [b].[e].[g].[i].[n].[\{].[c].[o].[d].[e].[\}]
|
||||
%% Eof -/- ~[]
|
||||
|
||||
%% lexical syntax
|
||||
%% VeryLongCom -> LAYOUT
|
||||
|
||||
|
||||
|
||||
module Stratego-Sugar
|
||||
imports
|
||||
Stratego-Sugar-Layout
|
||||
Stratego-Core-Identifiers
|
||||
Stratego-Sugar-Constants
|
||||
Stratego-Sugar-Modules
|
||||
Stratego-Sugar-Signatures
|
||||
Stratego-Sugar-Terms
|
||||
Stratego-Sugar-Strategies
|
||||
Stratego-Sugar-Rules
|
||||
Stratego-Sugar-DynamicRules
|
||||
Stratego-Sugar-Overlays
|
||||
|
||||
hiddens
|
||||
context-free start-symbols Module
|
||||
|
||||
module Stratego
|
||||
imports Stratego-Sugar
|
||||
hiddens
|
||||
context-free start-symbols Module
|
||||
|
||||
module StrategoMix[Ctx0]
|
||||
imports Stratego
|
||||
[ RuleNames => RuleNames[[Ctx0]]
|
||||
RuleDec => RuleDec[[Ctx0]]
|
||||
DynRuleScopeId => DynRuleScopeId[[Ctx0]]
|
||||
DynRuleId => DynRuleId[[Ctx0]]
|
||||
DynRuleDef => DynRuleDef[[Ctx0]]
|
||||
ScopeLabels => ScopeLabels[[Ctx0]]
|
||||
RuleCond => RuleCond[[Ctx0]]
|
||||
Rule => Rule[[Ctx0]]
|
||||
RuleDef => RuleDef[[Ctx0]]
|
||||
Overlay => Overlay[[Ctx0]]
|
||||
SwitchCase => SwitchCase[[Ctx0]]
|
||||
StrategyCurly => StrategyCurly[[Ctx0]]
|
||||
StrategyAngle => StrategyAngle[[Ctx0]]
|
||||
Kind => Kind[[Ctx0]]
|
||||
LID => LID[[Ctx0]]
|
||||
ImportModName => ImportModName[[Ctx0]]
|
||||
Decl => Decl[[Ctx0]]
|
||||
Module => Module[[Ctx0]]
|
||||
StrategyParen => StrategyParen[[Ctx0]]
|
||||
Typedid => Typedid[[Ctx0]]
|
||||
Anno => Anno[[Ctx0]]
|
||||
EmptyId => EmptyId[[Ctx0]]
|
||||
StrategyDef => StrategyDef[[Ctx0]]
|
||||
SVar => SVar[[Ctx0]]
|
||||
Def => Def[[Ctx0]]
|
||||
Type => Type[[Ctx0]]
|
||||
RetType => RetType[[Ctx0]]
|
||||
ArgType => ArgType[[Ctx0]]
|
||||
FunType => FunType[[Ctx0]]
|
||||
ConstType => ConstType[[Ctx0]]
|
||||
Opdecl => Opdecl[[Ctx0]]
|
||||
Sort => Sort[[Ctx0]]
|
||||
Sdecl => Sdecl[[Ctx0]]
|
||||
Wld => Wld[[Ctx0]]
|
||||
ID => ID[[Ctx0]]
|
||||
Var => Var[[Ctx0]]
|
||||
CharChar => CharChar[[Ctx0]]
|
||||
Char => Char[[Ctx0]]
|
||||
Padding => Padding[[Ctx0]]
|
||||
Dollar4 => Dollar4[[Ctx0]]
|
||||
QuotedBracket4 => QuotedBracket4[[Ctx0]]
|
||||
StringQuotedChars4 => StringQuotedChars4[[Ctx0]]
|
||||
StringQuotedPart4 => StringQuotedPart4[[Ctx0]]
|
||||
Dollar3 => Dollar3[[Ctx0]]
|
||||
QuotedBracket3 => QuotedBracket3[[Ctx0]]
|
||||
StringQuotedChars3 => StringQuotedChars3[[Ctx0]]
|
||||
StringQuotedPart3 => StringQuotedPart3[[Ctx0]]
|
||||
Dollar2 => Dollar2[[Ctx0]]
|
||||
QuotedBracket2 => QuotedBracket2[[Ctx0]]
|
||||
StringQuotedChars2 => StringQuotedChars2[[Ctx0]]
|
||||
StringQuotedPart2 => StringQuotedPart2[[Ctx0]]
|
||||
Dollar1 => Dollar1[[Ctx0]]
|
||||
QuotedBracket1 => QuotedBracket1[[Ctx0]]
|
||||
StringQuotedChars1 => StringQuotedChars1[[Ctx0]]
|
||||
StringQuotedPart1 => StringQuotedPart1[[Ctx0]]
|
||||
StringQuotation => StringQuotation[[Ctx0]]
|
||||
StrChar => StrChar[[Ctx0]]
|
||||
String => String[[Ctx0]]
|
||||
Real => Real[[Ctx0]]
|
||||
Int => Int[[Ctx0]]
|
||||
Keyword => Keyword[[Ctx0]]
|
||||
UCID => UCID[[Ctx0]]
|
||||
LCID => LCID[[Ctx0]]
|
||||
LId => LId[[Ctx0]]
|
||||
Id => Id[[Ctx0]]
|
||||
ModNamePart => ModNamePart[[Ctx0]]
|
||||
ModName => ModName[[Ctx0]]
|
||||
PreTerm => PreTerm[[Ctx0]]
|
||||
Term => Term[[Ctx0]]
|
||||
StrategyMid => StrategyMid[[Ctx0]]
|
||||
Strategy => Strategy[[Ctx0]] ]
|
||||
42
IBAF-Editor/metaborg.yaml
Normal file
42
IBAF-Editor/metaborg.yaml
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
id: org.example:IBAF-Editor:0.1.0-SNAPSHOT
|
||||
name: IBAF
|
||||
dependencies:
|
||||
compile:
|
||||
- org.metaborg:org.metaborg.meta.lang.esv:${metaborgVersion}
|
||||
- org.metaborg:org.metaborg.meta.lang.template:${metaborgVersion}
|
||||
- org.metaborg:org.metaborg.meta.nabl2.lang:${metaborgVersion}
|
||||
source:
|
||||
- org.metaborg:meta.lib.spoofax:${metaborgVersion}
|
||||
- org.metaborg:org.metaborg.meta.nabl2.shared:${metaborgVersion}
|
||||
- org.metaborg:org.metaborg.meta.nabl2.runtime:${metaborgVersion}
|
||||
pardonedLanguages:
|
||||
- EditorService
|
||||
- Stratego-Sugar
|
||||
- SDF
|
||||
language:
|
||||
sdf:
|
||||
enabled: true
|
||||
pretty-print: IBAF
|
||||
sdf2table: java
|
||||
placeholder:
|
||||
prefix: "$"
|
||||
stratego:
|
||||
enabled: true
|
||||
format: jar
|
||||
args:
|
||||
- -la
|
||||
- stratego-lib
|
||||
- -la
|
||||
- stratego-gpp
|
||||
- -la
|
||||
- stratego-sglr
|
||||
- -la
|
||||
- stratego-xtc
|
||||
- -la
|
||||
- stratego-aterm
|
||||
- -la
|
||||
- stratego-sdf
|
||||
- -la
|
||||
- strc
|
||||
exports:
|
||||
64
IBAF-Editor/pom.xml
Normal file
64
IBAF-Editor/pom.xml
Normal file
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>IBAF-Editor</artifactId>
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<packaging>spoofax-language</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>org.metaborg</groupId>
|
||||
<artifactId>parent.language</artifactId>
|
||||
<version>2.5.18</version>
|
||||
</parent>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>metaborg-release-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/releases/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>metaborg-snapshot-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/snapshots/</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>metaborg-release-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/releases/</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
<pluginRepository>
|
||||
<id>metaborg-snapshot-repo</id>
|
||||
<url>https://artifacts.metaborg.org/content/repositories/snapshots/</url>
|
||||
<releases>
|
||||
<enabled>false</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>true</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</project>
|
||||
@@ -0,0 +1,10 @@
|
||||
package IBAF_Editor.strategies;
|
||||
|
||||
import org.strategoxt.lang.JavaInteropRegisterer;
|
||||
import org.strategoxt.lang.Strategy;
|
||||
|
||||
public class InteropRegisterer extends JavaInteropRegisterer {
|
||||
public InteropRegisterer() {
|
||||
super(new Strategy[] { });
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package IBAF_Editor.strategies;
|
||||
|
||||
import org.strategoxt.lang.Context;
|
||||
|
||||
public class Main {
|
||||
public static void init(Context context) {
|
||||
|
||||
}
|
||||
}
|
||||
9
IBAF-Editor/syntax/Funcons-pp.sdf3
Normal file
9
IBAF-Editor/syntax/Funcons-pp.sdf3
Normal file
@@ -0,0 +1,9 @@
|
||||
module Funcons-pp
|
||||
|
||||
imports Funcons
|
||||
|
||||
context-free syntax
|
||||
|
||||
FCT.FCTAppComp = <
|
||||
<{NAME " "}+>
|
||||
<FCT> > // for pp only
|
||||
87
IBAF-Editor/syntax/Funcons.sdf3
Normal file
87
IBAF-Editor/syntax/Funcons.sdf3
Normal file
@@ -0,0 +1,87 @@
|
||||
module Funcons
|
||||
|
||||
context-free start-symbols
|
||||
Start
|
||||
|
||||
context-free syntax
|
||||
Start = FCT {avoid}
|
||||
|
||||
FCT-SEQ.FCTSequence = <
|
||||
<FCT-SEQ>,
|
||||
<FCT-SEQ>> {right}
|
||||
FCT-SEQ.FCTEmpty =
|
||||
FCT-SEQ = FCT
|
||||
|
||||
FCT.FCTInt =
|
||||
INT
|
||||
FCT.FCTFloat =
|
||||
FLOAT
|
||||
FCT.FCTChar =
|
||||
CHAR
|
||||
FCT.FCTString =
|
||||
STRING
|
||||
FCT.FCTDoubleQuoted =
|
||||
<\\"<FCT-Quoted>\\">
|
||||
FCT.FCTVar
|
||||
= VAR
|
||||
FCT.FCTName
|
||||
= NAME
|
||||
FCT.FCTApp = <
|
||||
<NAME> <FCT> >
|
||||
// FCT.FCTSemantics = SEM-NAME PHRASE-FCT FCT?
|
||||
FCT.FCTTyped = <
|
||||
<FCT>:<FCT> > {non-assoc}
|
||||
FCT.FCTComplement = <
|
||||
~ <FCT> >
|
||||
FCT.FCTComputes = <
|
||||
<FCT?> =\> <FCT> > {non-assoc}
|
||||
FCT.FCTPostfix = <
|
||||
<FCT><POSTFIX> >
|
||||
FCT.FCTUnion = <
|
||||
<FCT> | <{FCT " | "}+> >
|
||||
FCT.FCTIntersect = <
|
||||
<FCT> & <{FCT " & "}+> >
|
||||
FCT.FCTGroup = <
|
||||
(<FCT-SEQ>) >
|
||||
FCT.FCTList = <
|
||||
[<FCT-SEQ>] >
|
||||
FCT.FCTSet = <
|
||||
{<FCT-SEQ>} >
|
||||
FCT.FCTMap = <
|
||||
{<{FCT-POINT ",\n"}*>} >
|
||||
|
||||
FCT-POINT.Point = <
|
||||
<FCT> |-\> <FCT> >
|
||||
|
||||
FCT-Quoted.FCTQuotedEmpty =
|
||||
|
||||
lexical syntax
|
||||
INT = "-"? [0-9]+
|
||||
FLOAT = "-"? [0-9]+ "." [0-9]+
|
||||
CHAR = "'" ~[] "'"
|
||||
STRING = "\"" STRING-CHAR* "\""
|
||||
STRING-CHAR = ~[\"\n] | "\\\"" | BACKSLASH
|
||||
BACKSLASH = "\\"
|
||||
NAME = [a-z] [a-zA-Z0-9\-]*
|
||||
VAR = [A-Z] [a-zA-Z]* ([\-] [a-zA-Z]+)* SUFFIX? POSTFIX?
|
||||
SUFFIX = [0-9]+ | [\']+ | ([0-9]+ [\']+)
|
||||
POSTFIX = "*" | "+" | "?"
|
||||
|
||||
LAYOUT = [\ \t\n\r]
|
||||
LAYOUT = "/*" (~[\*] | STAR)* "*/"
|
||||
STAR = "*"
|
||||
LAYOUT = "//" ~[\n\r]* ([\n\r] | EOF)
|
||||
EOF =
|
||||
|
||||
lexical restrictions
|
||||
INT -/- [0-9]
|
||||
FLOAT -/- [0-9]
|
||||
NAME -/- [a-zA-Z0-9\-]
|
||||
BACKSLASH -/- [\"]
|
||||
STAR -/- [\/]
|
||||
EOF -/- ~[]
|
||||
|
||||
context-free restrictions
|
||||
LAYOUT? -/- [\ \t\n\r]
|
||||
LAYOUT? -/- [\/].[\/]
|
||||
LAYOUT? -/- [\/].[\*]
|
||||
12
IBAF-Editor/syntax/IBAF.sdf3
Normal file
12
IBAF-Editor/syntax/IBAF.sdf3
Normal file
@@ -0,0 +1,12 @@
|
||||
module IBAF
|
||||
|
||||
imports
|
||||
IBAF-Start
|
||||
|
||||
context-free start-symbols
|
||||
|
||||
Start
|
||||
|
||||
context-free syntax
|
||||
|
||||
Start = L-start
|
||||
11
IBAF-Editor/syntax/Stratego-IBAF.sdf
Normal file
11
IBAF-Editor/syntax/Stratego-IBAF.sdf
Normal file
@@ -0,0 +1,11 @@
|
||||
module Stratego-IBAF
|
||||
|
||||
imports
|
||||
Stratego
|
||||
IBAF
|
||||
exports context-free syntax
|
||||
Module -> Start
|
||||
"|[" FCT-SEQ "]|" -> Term {cons("ToTerm"),prefer}
|
||||
|
||||
variables
|
||||
"START" -> L-start {prefer}
|
||||
72
IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3
Normal file
72
IBAF-Editor/syntax/cbs-gen/IBAF-Start.sdf3
Normal file
@@ -0,0 +1,72 @@
|
||||
module IBAF-Start
|
||||
|
||||
imports
|
||||
|
||||
Funcons
|
||||
|
||||
// Language "IBAFlang"
|
||||
|
||||
lexical syntax // Language
|
||||
LEX-int = ( [0-9] )+
|
||||
LEX-id = ( [a-z] ) ( [a-z] | [0-9] )*
|
||||
|
||||
syntax // Language
|
||||
|
||||
context-free syntax // Language
|
||||
L-start.L-start--L-exp =
|
||||
L-exp
|
||||
|
||||
L-exp.L-exp--L-int =
|
||||
L-int
|
||||
L-exp.L-exp--L-id =
|
||||
L-id
|
||||
L-exp.L-exp--R-lambda-L-id-DOT-L-exp =
|
||||
"lambda" L-id "." L-exp
|
||||
L-exp.L-exp--L-exp-LPAREN-L-exp-RPAREN =
|
||||
L-exp "(" L-exp ")"
|
||||
L-exp.L-exp--R-let-L-id-EQUALS-L-exp-R-in-L-exp =
|
||||
"let" L-id "=" L-exp "in" L-exp
|
||||
L-exp.L-exp--LPAREN-L-exp-RPAREN =
|
||||
"(" L-exp ")"
|
||||
|
||||
L-int.LEX-int =
|
||||
LEX-int
|
||||
L-id.LEX-id =
|
||||
LEX-id
|
||||
|
||||
context-free syntax // Semantics
|
||||
FCT.T-start =
|
||||
"start" "[:" L-start ":]"
|
||||
FCT.T-eval =
|
||||
"eval" "[:" L-exp ":]"
|
||||
FCT-Quoted.L-int = L-int
|
||||
FCT.T-int =
|
||||
"int" "[:" L-int ":]"
|
||||
FCT-Quoted.L-id = L-id
|
||||
FCT.T-id =
|
||||
"id" "[:" L-id ":]"
|
||||
|
||||
context-free syntax // Desugaring
|
||||
|
||||
variables // Meta-variables
|
||||
L-start = "(:START" [1-9]? ":)" {prefer}
|
||||
L-start? = "(:START" [1-9]? "?:)" {prefer}
|
||||
L-start* = "(:START" [1-9]? "*:)" {prefer}
|
||||
L-start+ = "(:START" [1-9]? "+:)" {prefer}
|
||||
L-exp = "(:E" [1-9]? ":)" {prefer}
|
||||
L-exp? = "(:E" [1-9]? "?:)" {prefer}
|
||||
L-exp* = "(:E" [1-9]? "*:)" {prefer}
|
||||
L-exp+ = "(:E" [1-9]? "+:)" {prefer}
|
||||
L-int = "(:N" [1-9]? ":)" {prefer}
|
||||
L-int? = "(:N" [1-9]? "?:)" {prefer}
|
||||
L-int* = "(:N" [1-9]? "*:)" {prefer}
|
||||
L-int+ = "(:N" [1-9]? "+:)" {prefer}
|
||||
L-id = "(:X" [1-9]? ":)" {prefer}
|
||||
L-id? = "(:X" [1-9]? "?:)" {prefer}
|
||||
L-id* = "(:X" [1-9]? "*:)" {prefer}
|
||||
L-id+ = "(:X" [1-9]? "+:)" {prefer}
|
||||
|
||||
// SDF comments
|
||||
|
||||
sorts // ASTs
|
||||
T-start
|
||||
34
IBAF-Editor/trans/analysis.str
Normal file
34
IBAF-Editor/trans/analysis.str
Normal file
@@ -0,0 +1,34 @@
|
||||
module analysis
|
||||
|
||||
imports
|
||||
libstratego-lib
|
||||
|
||||
imports
|
||||
|
||||
nabl2/api
|
||||
nabl2/runtime
|
||||
|
||||
statics
|
||||
|
||||
pp
|
||||
|
||||
rules // Analysis
|
||||
|
||||
editor-analyze = nabl2-analyze(id)
|
||||
|
||||
rules // Debugging
|
||||
|
||||
// Prints the abstract syntax ATerm of a selection.
|
||||
debug-show-aterm: (selected, _, _, path, project-path) -> (filename, result)
|
||||
with filename := <guarantee-extension(|"aterm")> path
|
||||
; result := selected
|
||||
|
||||
// Prints the analyzed annotated abstract syntax ATerm of a selection.
|
||||
debug-show-analyzed: (selected, _, _, path, project-path) -> (filename, result)
|
||||
with filename := <guarantee-extension(|"analyzed.aterm")> path
|
||||
; result := selected
|
||||
|
||||
rules // Rename refactoring
|
||||
|
||||
// change last strategy argument to id if multi-file analysis is enabled
|
||||
rename-menu-action = nabl2-rename-action(construct-textual-change, editor-analyze, fail)
|
||||
1
IBAF-Editor/trans/cbs-gen/IBAF-Start.meta
Normal file
1
IBAF-Editor/trans/cbs-gen/IBAF-Start.meta
Normal file
@@ -0,0 +1 @@
|
||||
Meta([Syntax("Stratego-IBAF")])
|
||||
53
IBAF-Editor/trans/cbs-gen/IBAF-Start.str
Normal file
53
IBAF-Editor/trans/cbs-gen/IBAF-Start.str
Normal file
@@ -0,0 +1,53 @@
|
||||
module IBAF-Start
|
||||
|
||||
imports
|
||||
libstratego-gpp
|
||||
signatures/-
|
||||
pp/IBAF-parenthesize
|
||||
pp/IBAF-pp
|
||||
|
||||
imports
|
||||
|
||||
|
||||
// Language "IBAFlang"
|
||||
|
||||
rules
|
||||
to-funcons:
|
||||
|[ start[: (:E:) :] ]| ->
|
||||
|[ initialise-binding finalise-failing eval[: (:E:) :] ]|
|
||||
to-funcons:
|
||||
|[ eval[: (:N:) :] ]| ->
|
||||
|[ int[: (:N:) :] ]|
|
||||
to-funcons:
|
||||
|[ eval[: (:X:) :] ]| ->
|
||||
|[ bound id[: (:X:) :] ]|
|
||||
to-funcons:
|
||||
|[ eval[: lambda(:X:).(:E:) :] ]| ->
|
||||
|[ function closure scope (bind (id[: (:X:) :],
|
||||
given),
|
||||
eval[: (:E:) :]) ]|
|
||||
to-funcons:
|
||||
|[ eval[: (:E1:)((:E2:)) :] ]| ->
|
||||
|[ apply (eval[: (:E1:) :],
|
||||
eval[: (:E2:) :]) ]|
|
||||
to-funcons:
|
||||
|[ eval[: let(:X:)=(:E1:)in(:E2:) :] ]| ->
|
||||
|[ scope (bind (id[: (:X:) :],
|
||||
eval[: (:E1:) :]),
|
||||
eval[: (:E2:) :]) ]|
|
||||
to-funcons:
|
||||
|[ eval[: ((:E:)) :] ]| ->
|
||||
|[ eval[: (:E:) :] ]|
|
||||
to-funcons-lex:
|
||||
FCTDoubleQuoted(L-int(LEX-int(str))) ->
|
||||
FCTString(<double-quote> str)
|
||||
to-funcons:
|
||||
|[ int[: (:N:) :] ]| ->
|
||||
|[ decimal \"(:N:)\" ]|
|
||||
to-funcons-lex:
|
||||
FCTDoubleQuoted(L-id(LEX-id(str))) ->
|
||||
FCTString(<double-quote> str)
|
||||
to-funcons:
|
||||
|[ id[: (:X:) :] ]| ->
|
||||
|[ \"(:X:)\" ]|
|
||||
|
||||
1
IBAF-Editor/trans/generate.meta
Normal file
1
IBAF-Editor/trans/generate.meta
Normal file
@@ -0,0 +1 @@
|
||||
Meta([Syntax("Stratego-IBAF")])
|
||||
118
IBAF-Editor/trans/generate.str
Normal file
118
IBAF-Editor/trans/generate.str
Normal file
@@ -0,0 +1,118 @@
|
||||
module generate
|
||||
|
||||
imports
|
||||
libstratego-gpp
|
||||
signatures/-
|
||||
pp/IBAF-parenthesize
|
||||
pp/IBAF-pp
|
||||
pp/Funcons-pp-pp
|
||||
cbs-gen/IBAF-Start
|
||||
|
||||
rules // Builder
|
||||
|
||||
// Generates a funcon term for selected AST.
|
||||
generate-fct:
|
||||
(selected, position, ast, path, project-path) -> (filename, result)
|
||||
where <not(has-extension(|"fct"))> <debug> path
|
||||
with
|
||||
filename := <guarantee-extension(|"fct")> path;
|
||||
funcons := <to-funcons-top> selected;
|
||||
result := <prettyprint-IBAF-string> funcons
|
||||
|
||||
generate-fct:
|
||||
(selected, position, ast, path, project-path) -> None()
|
||||
where <has-extension(|"fct")> path
|
||||
|
||||
prettyprint-IBAF-string =
|
||||
parenthesize-IBAF
|
||||
; prettyprint-IBAF-Start
|
||||
; !V([], <id>)
|
||||
; box2text-string(|80)
|
||||
|
||||
to-funcons-start: START -> |[ start[: START :] ]|
|
||||
|
||||
to-funcons-top =
|
||||
to-funcons-start;
|
||||
innermost(to-desugared <+ to-funcons <+ to-funcons-default);
|
||||
bottomup(try(to-funcons-lex));
|
||||
innermost(to-funcons-sequences <+ to-funcons-groups);
|
||||
innermost(to-funcons-apps)
|
||||
|
||||
to-funcons = fail
|
||||
|
||||
to-funcons-default = fail
|
||||
|
||||
to-desugared = fail
|
||||
|
||||
// Funcons involved in simplification rules:
|
||||
|
||||
rules
|
||||
|
||||
to-funcons-sequences:
|
||||
FCTSequence(FCTEmpty(),seq) -> seq
|
||||
|
||||
to-funcons-sequences:
|
||||
FCTSequence(seq,FCTEmpty()) -> seq
|
||||
|
||||
to-funcons-sequences:
|
||||
FCTApp("sequential",FCTGroup(FCTSequence(fct,FCTApp("sequential",FCTGroup(seq))))) ->
|
||||
FCTApp("sequential",FCTGroup(FCTSequence(fct,seq)))
|
||||
|
||||
to-funcons-groups:
|
||||
FCTGroup(FCTGroup(seq)) -> FCTGroup(seq)
|
||||
|
||||
to-funcons-apps:
|
||||
FCTApp(f1,FCTApp(f2,fct)) -> FCTAppComp([f1,f2],fct)
|
||||
|
||||
to-funcons-apps:
|
||||
FCTApp(f,FCTAppComp(fs,fct)) -> FCTAppComp([f|fs],fct)
|
||||
|
||||
to-funcons-apps:
|
||||
FCTApp(f,FCTGroup(seq)) -> FCTAppComp([f],FCTGroup(seq))
|
||||
|
||||
rules
|
||||
|
||||
to-funcons-lex:
|
||||
FCTString(str) -> FCTString(<double-quote> str)
|
||||
|
||||
to-funcons-lex = ?FCTInt(_)
|
||||
|
||||
to-funcons-lex = ?FCTChar(_)
|
||||
|
||||
to-funcons-lex: FCTApp("integer-add",FCTGroup(FCTSequence(FCTInt(s),FCTInt(t)))) ->
|
||||
FCTInt(<addi;int-to-string>(<string-to-int> s, <string-to-int> t))
|
||||
|
||||
to-funcons-lex: FCTApp("string-append",FCTGroup(FCTSequence(FCTString(str1),FCTString(str2)))) ->
|
||||
FCTString(<concat-strings;double-quote> [<un-double-quote> str1, <un-double-quote> str2])
|
||||
|
||||
to-funcons-lex: FCTApp("string-append",FCTGroup(FCTSequence(FCTString(str1),FCTSequence(FCTString(str2),FCTString(str3))))) ->
|
||||
FCTString(<concat-strings;double-quote>
|
||||
[<un-double-quote> str1, <un-double-quote> str2, <un-double-quote> str3])
|
||||
// generalise to nested sequences
|
||||
|
||||
to-funcons-lex: FCTList(seq) ->
|
||||
FCTString(<concat-strings;double-quote> l)
|
||||
where
|
||||
<not(?FCTEmpty())> seq;
|
||||
l := <to-funcons-string-list>(seq, [])
|
||||
|
||||
|
||||
// l accumulates a list of strings, initially []:
|
||||
to-funcons-string-list: (FCTSequence(seq1, seq2), l) ->
|
||||
<to-funcons-string-list>(seq1, <to-funcons-string-list>(seq2, l))
|
||||
|
||||
to-funcons-string-list: (FCTEmpty(), l) -> l
|
||||
|
||||
// 'C':
|
||||
to-funcons-string-list: (FCTString(str), l) ->
|
||||
[<un-single-quote>str | l]
|
||||
|
||||
// ascii-character("C"):
|
||||
to-funcons-string-list:
|
||||
(FCTApp("ascii-character", FCTGroup(FCTString(str))), l) ->
|
||||
[<un-double-quote>str | l]
|
||||
|
||||
// ascii-character("\C"):
|
||||
to-funcons-string-list:
|
||||
(FCTApp("ascii-character", FCTApp("list-to-string", FCTList(seq))), l) ->
|
||||
<to-funcons-string-list>(seq, l)
|
||||
21
IBAF-Editor/trans/ibaf.str
Normal file
21
IBAF-Editor/trans/ibaf.str
Normal file
@@ -0,0 +1,21 @@
|
||||
module ibaf
|
||||
|
||||
imports
|
||||
libstratego-lib
|
||||
|
||||
imports
|
||||
completion/completion
|
||||
pp
|
||||
outline
|
||||
analysis
|
||||
|
||||
imports
|
||||
generate
|
||||
|
||||
rules // Debugging
|
||||
|
||||
debug-show-aterm:
|
||||
(node, _, _, path, project-path) -> (filename, result)
|
||||
with
|
||||
filename := <guarantee-extension(|"aterm")> path
|
||||
; result := node
|
||||
18
IBAF-Editor/trans/outline.str
Normal file
18
IBAF-Editor/trans/outline.str
Normal file
@@ -0,0 +1,18 @@
|
||||
module outline
|
||||
|
||||
imports
|
||||
libstratego-lib
|
||||
|
||||
imports
|
||||
|
||||
signatures/IBAF-sig
|
||||
libspoofax/editor/outline
|
||||
|
||||
rules
|
||||
|
||||
editor-outline:
|
||||
(_, _, ast, path, project-path) -> outline
|
||||
where
|
||||
outline := <simple-label-outline(to-outline-label)> ast
|
||||
|
||||
to-outline-label = fail
|
||||
52
IBAF-Editor/trans/pp.str
Normal file
52
IBAF-Editor/trans/pp.str
Normal file
@@ -0,0 +1,52 @@
|
||||
module pp
|
||||
|
||||
imports
|
||||
libstratego-lib
|
||||
|
||||
imports
|
||||
|
||||
libstratego-gpp
|
||||
libspoofax/sdf/pp
|
||||
libspoofax/editor/refactoring/-
|
||||
pp/IBAF-parenthesize
|
||||
pp/IBAF-pp
|
||||
|
||||
rules
|
||||
|
||||
editor-format:
|
||||
(node, _, ast, path, project-path) -> (filename, result)
|
||||
with
|
||||
ext := <get-extension> path
|
||||
; filename := <guarantee-extension(|$[pp.[ext]])> path
|
||||
; result := <pp-debug> node
|
||||
|
||||
rules
|
||||
|
||||
pp-IBAF-string =
|
||||
parenthesize-IBAF
|
||||
; prettyprint-IBAF-start-symbols
|
||||
; !V([], <id>)
|
||||
; box2text-string(|120)
|
||||
|
||||
pp-partial-IBAF-string =
|
||||
parenthesize-IBAF
|
||||
; prettyprint-IBAF
|
||||
; !V([], <id>)
|
||||
; box2text-string(|120)
|
||||
|
||||
pp-partial-IBAF-string(|sort) =
|
||||
parenthesize-IBAF
|
||||
; prettyprint-IBAF(|sort)
|
||||
; !V([], <id>)
|
||||
; box2text-string(|120)
|
||||
|
||||
pp-debug :
|
||||
ast -> result
|
||||
with
|
||||
result := <pp-IBAF-string> ast
|
||||
<+ <bottomup(try(not(is-string); not(is-list); not(pp-IBAF-string); debug(!"cannot pp ")))> ast
|
||||
; result := ""
|
||||
|
||||
rules
|
||||
|
||||
construct-textual-change = construct-textual-change(pp-partial-IBAF-string, parenthesize, override-reconstruction, resugar)
|
||||
12
IBAF-Editor/trans/statics.nabl2
Normal file
12
IBAF-Editor/trans/statics.nabl2
Normal file
@@ -0,0 +1,12 @@
|
||||
module statics
|
||||
|
||||
imports
|
||||
|
||||
signatures/-
|
||||
|
||||
rules
|
||||
|
||||
init ^ (s) := new s.
|
||||
|
||||
[[ _ ^ (s) ]].
|
||||
|
||||
17
IBAF-cbs/.project
Normal file
17
IBAF-cbs/.project
Normal file
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>IBAF-cbs</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.metaborg.spoofax.eclipse.builder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.metaborg.spoofax.eclipse.nature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
1
IBAF-cbs/Funcons-beta
Symbolic link
1
IBAF-cbs/Funcons-beta
Symbolic link
@@ -0,0 +1 @@
|
||||
/home/peter/cbs-all/CBS-beta/Funcons-beta
|
||||
47
IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs
Normal file
47
IBAF-cbs/IBAF/IBAF-Start/IBAF-Start.cbs
Normal file
@@ -0,0 +1,47 @@
|
||||
Language "IBAFlang"
|
||||
|
||||
Syntax START:start ::= exp
|
||||
|
||||
Semantics start[[ _:start ]] : =>values
|
||||
|
||||
Rule start[[ E ]] =
|
||||
initialise-binding finalise-failing eval[[ E ]]
|
||||
|
||||
Syntax E:exp ::= int
|
||||
| id
|
||||
| 'lambda' id '.' exp
|
||||
| exp '(' exp ')'
|
||||
| 'let' id '=' exp 'in' exp
|
||||
| '(' exp ')'
|
||||
|
||||
Semantics eval[[ _:exp ]] : => values
|
||||
|
||||
Rule eval[[ N ]] = int[[ N ]]
|
||||
|
||||
Rule eval[[ X ]] = bound id[[ X ]]
|
||||
|
||||
Rule eval[[ 'lambda' X '.' E ]] =
|
||||
function closure
|
||||
scope( bind( id[[ X ]], given ),
|
||||
eval[[ E ]] )
|
||||
|
||||
Rule eval[[ E1 '(' E2 ')' ]] =
|
||||
apply( eval[[ E1 ]], eval[[ E2 ]] )
|
||||
|
||||
Rule eval[[ 'let' X '=' E1 'in' E2 ]] =
|
||||
scope( bind( id[[ X ]], eval[[ E1 ]] ),
|
||||
eval[[ E2 ]] )
|
||||
|
||||
Rule eval[[ '(' E ')' ]] = eval[[ E ]]
|
||||
|
||||
|
||||
Lexis N:int ::= ('0'-'9')+
|
||||
|
||||
Semantics int[[ N:int ]] : => integers
|
||||
= decimal \"N\"
|
||||
|
||||
|
||||
Lexis X:id ::= ('a'-'z') ('a'-'z'|'0'-'9')*
|
||||
|
||||
Semantics id[[ X:id ]] : => identifiers
|
||||
= \"X\"
|
||||
Binary file not shown.
Reference in New Issue
Block a user