blob: 2c3ca0476057ce4d198365c52d1f6d21f8d32184 [file] [log] [blame]
-- @authors Frédéric Jouault
-- @date 2006/01/13
-- @description This TCS model defines the syntax of SQL DDL.
syntax SQLDDL {
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%)";
primitiveTemplate floatSymbol for Double default using FLOAT:
value = "Double.valueOf(%token%)";
template Database main context
: tables
;
template Table context addToContext
: "CREATE" "TABLE" name "(" [
elements{separator = ","}
] ")" parameters ";"
;
-- @end Table Elements
template TableElement abstract;
template Column addToContext
: name type
(canBeNull ? : "NOT" "NULL")
(isDefined(default) ? "default" default{as = stringSymbol})
;
template Key abstract;
template SimpleKey
: (isUnique ? "UNIQUE")
"KEY" (isDefined(name) ? name) "(" columns{refersTo = name, separator = ","} ")"
;
template PrimaryKey
: "PRIMARY" (isUnique ? "UNIQUE")
"KEY" (isDefined(name) ? name) "(" columns{refersTo = name, separator = ","} ")"
;
template ForeignKey
: "FOREIGN" (isUnique ? "UNIQUE")
"KEY" (isDefined(name) ? name) "(" columns{refersTo = name, separator = ","} ")"
"REFERENCES" referencedTable{refersTo = name} "(" referencedColumns{separator = ",", refersTo = name, lookIn = referencedTable} ")"
;
-- @begin Table Elements
template Type
: name (isDefined(length) ? "(" length{separator = ","} ")") (isUnsigned ? "unsigned")
;
template Parameter
: name (isDefined(value) ? "=" value)
;
-- @begin Values
template Value abstract;
template IntegerVal
: value
;
template NullVal
: "NULL"
;
template StringVal
: value{as = stringSymbol}
;
-- @end Values
symbols {
lsquare = "[";
rsquare = "]" : rightSpace;
excl = "!";
coma = "," : leftNone, rightSpace;
lparen = "(" : leftSpace;
rparen = ")" : rightSpace;
lcurly = "{" : leftSpace;
rcurly = "}";
semi = ";";
colon = ":" : leftSpace, rightSpace;
colons = "::";
pipe = "|";
sharp = "#";
qmark = "?";
-- operator symbols
point = ".";
rarrow = "->";
minus = "-";
star = "*";
slash = "/";
plus = "+";
eq = "=";
gt = ">";
lt = "<";
ge = ">=";
le = "<=";
ne = "<>";
larrow = "<-";
}
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)+
%v2 (('.' DIGIT)=> '.' (DIGIT)+ {$setType(FLOAT);})?
;
%v3 FLOAT : DIGIT+ (('.' DIGIT)=>'.' DIGIT+)? ; // cannot accept DIGIT '.' because it would conflict with Navigation
%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));}
;
";
}