Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'syntaxes/Scatter/Syntax/Scatter.tcs')
-rw-r--r--syntaxes/Scatter/Syntax/Scatter.tcs275
1 files changed, 275 insertions, 0 deletions
diff --git a/syntaxes/Scatter/Syntax/Scatter.tcs b/syntaxes/Scatter/Syntax/Scatter.tcs
new file mode 100644
index 0000000..92ff00b
--- /dev/null
+++ b/syntaxes/Scatter/Syntax/Scatter.tcs
@@ -0,0 +1,275 @@
+-- @authors Frédéric Jouault, Jules White
+-- @date 2007/10/04/
+-- @description This TCS model defines the syntax of the Scatter language.
+syntax Scatter {
+
+ primitiveTemplate identifier for String default using NAME:
+ value = "%token%";
+
+ primitiveTemplate stringSymbol for String using STRING:
+ value = "%token%",
+ serializer="'\'' + %value%.toCString() + '\''";
+
+ primitiveTemplate integerSymbol for Integer default using INT:
+ value = "Integer.valueOf(%token%)";
+
+ template SourceItem main context
+ : [ features ] {nbNL = 2, startNL = false, indentIncr = 0}
+ ;
+
+ template Feature addToContext
+ : name "{" [
+ directives
+ ] "}"
+ ;
+
+-- @begin Directives
+ template Directive abstract;
+
+ template Requires
+ : "Requires" ":" features{refersTo = name, separator = ","} ";"
+ ;
+
+ template Instances
+ : "Instances" ":" cardinality ";"
+ ;
+
+ template Select
+ : "Select" ":" "[" cardinality "]" "," features{refersTo = name, separator = ","} ";"
+ ;
+
+ template Target
+ : "Target" ":" constraint ";"
+ ;
+
+ template Set
+ : "Set" ":" valueDefinition ";"
+ ;
+-- @end Directives
+
+ template Cardinality abstract;
+-- : (isDefined(lower) ?
+-- lower ".."
+-- ) upper
+-- ;
+
+ template BoundedCardinality
+ : lower ".." upper
+ ;
+
+ template FixedCardinality
+ : value
+ ;
+
+-- @begin Expressions
+ template Expression abstract operatored;
+
+ template FeaturePropertyExp
+ : feature{refersTo = name} "." name
+ ;
+
+ template SourcePropertyExp
+ : "Source" "." name
+ ;
+
+ template TargetPropertyExp
+ : "Target" "." name
+ ;
+
+ operatorTemplate BinaryOperatorExp(operators =
+ opPlus opMinus2
+ opStar opDiv opSlash opMod
+ opLt opLe opNe opGe opGt
+ opAnd opOr
+ , source = 'left', storeOpTo = operator, storeRightTo = 'right');
+
+ operatorTemplate EqualsExp(operators =
+ opEq
+ , source = 'left', storeRightTo = 'right');
+
+ template ConstantExp
+ : name
+ ;
+-- @end Expressions
+
+ symbols {
+ lsquare = "[";
+ rsquare = "]";
+ excl = "!";
+ coma = ",";
+ lparen = "(";
+ rparen = ")" : rightSpace;
+ lcurly = "{" : leftSpace;
+ rcurly = "}" : rightSpace;
+ semi = ";" : leftNone;
+ colon = ":" : leftSpace, rightSpace;
+ pipe = "|";
+ sharp = "#";
+ qmark = "?";
+
+ -- operator symbols
+ point = "." : leftNone;
+ rarrow = "->";
+ minus = "-" : leftSpace, rightSpace;
+ star = "*" : leftSpace, rightSpace;
+ slash = "/" : leftSpace, rightSpace;
+ plus = "+" : leftSpace, rightSpace;
+ eq = "=" : leftSpace, rightSpace;
+ gt = ">" : leftSpace, rightSpace;
+ lt = "<" : leftSpace, rightSpace;
+ ge = ">=" : leftSpace, rightSpace;
+ le = "<=" : leftSpace, rightSpace;
+ ne = "<>" : leftSpace, rightSpace;
+ larrow = "<-" : leftSpace, rightSpace;
+
+ assign = ":=" : leftSpace, rightSpace;
+ dotdot = "..";
+ }
+
+ operators {
+ priority 0 {
+ opStar = star, 2;
+ opSlash = slash, 2;
+ opDiv = "div", 2;
+ opMod = "mod", 2;
+ }
+
+ priority 1 {
+ opPlus = plus, 2;
+ opMinus2 = minus, 2;
+ }
+
+ priority 2 {
+ opEq = eq, 2;
+ opGt = gt, 2;
+ opLt = lt, 2;
+ opGe = ge, 2;
+ opLe = le, 2;
+ opNe = ne, 2;
+ }
+
+ priority 3 {
+ opAnd = "and", 2;
+ opOr = "or", 2;
+ }
+ }
+
+ token COMMENT : endOfLine(start = "--");
+
+ lexer = "
+%options testLiterals = false;
+NL
+ : ( '\\r' '\\n'
+ | '\\n' '\\r' //Improbable
+ | '\\r'
+ | '\\n'
+ )
+ {newline();}
+ ;
+
+WS
+ : ( ' '
+ | '\\t'
+ )
+ ;
+
+%protected
+DIGIT
+ : '0'..'9'
+ ;
+
+%protected
+ALPHA
+ : 'a'..'z'
+ | 'A'..'Z'
+ | '_'
+ //For Unicode compatibility (from 0000 to 00ff)
+ | '\\u00C0' .. '\\u00D6'
+ | '\\u00D8' .. '\\u00F6'
+ | '\\u00F8' .. '\\u00FF'
+ ;
+
+%protected
+SNAME
+%v2 options {
+%v2 testLiterals = true;
+%v2 }
+ : (ALPHA) (ALPHA | DIGIT)*
+;
+
+NAME
+ : (
+%v3 SNAME
+%v2 s:SNAME {if(s.getType() != SNAME) $setType(s.getType());}
+ | '\"'!
+ ( ESC
+ | '\\n' {newline();}
+ | ~('\\\\'|'\\\"'|'\\n')
+ )*
+ '\"'!
+%v3 {setText(ei.unescapeString(getText(), 1));}
+ )
+ ;
+
+INT
+ : (DIGIT)+
+ ;
+
+%protected
+ESC
+ : '\\\\'!
+ ( 'n' %v2{%setText(\"\\n\");}
+ | 'r' %v2{%setText(\"\\r\");}
+ | 't' %v2{%setText(\"\\t\");}
+ | 'b' %v2{%setText(\"\\b\");}
+ | 'f' %v2{%setText(\"\\f\");}
+ | '\"' %v2{%setText(\"\\\"\");}
+ | '\\'' %v2{%setText(\"\\'\");}
+ | '\\\\' %v2{%setText(\"\\\\\");}
+ | (
+ ('0'..'3')
+ (
+%v2 options {
+%v2 warnWhenFollowAmbig = false;
+%v2 }
+ : ('0'..'7')
+ (
+%v2 options {
+%v2 warnWhenFollowAmbig = false;
+%v2 }
+ : '0'..'7'
+ )?
+ )?
+ | ('4'..'7')
+ (
+%v2 options {
+%v2 warnWhenFollowAmbig = false;
+%v2 }
+ : ('0'..'7')
+ )?
+ )
+ {
+%v2 String s = %getText;
+%v2 int i;
+%v2 int ret = 0;
+%v2 String ans;
+%v2 for (i=0; i<s.length(); ++i)
+%v2 ret = ret*8 + s.charAt(i) - '0';
+%v2 ans = String.valueOf((char) ret);
+%v2 %setText(ans);
+ }
+ )
+ ;
+
+STRING
+ : '\\''!
+ ( ESC
+ | '\\n' {newline();}
+ | ~('\\\\'|'\\''|'\\n')
+ )*
+ '\\''!
+%v3 {setText(ei.unescapeString(getText(), 1));}
+ ;
+ ";
+}
+

Back to the top