-
Notifications
You must be signed in to change notification settings - Fork 0
/
JDL.jdl
123 lines (99 loc) · 3.68 KB
/
JDL.jdl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* Copyright 2017 Salvatore Giampà
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
/**
* JointyC Definition Language specifics:
*
* This file defines the formal JDL specifics through the JDL itself.
*
* This file exists for documentation only
**/
language: JDL;
lexicon:{
language = /language/$, "'language' string";
languageName = /[a-zA-Z0-9_]+/$, "language name";
langId = <languageName>, "language identifier";
name = /[a-zA-Z0-9\\.\\-\\+\\*]+/$, "A name containing letters digits and some special characters ( . - + * )";
lex = /lexicon/$, "'lexicon' string";
grammar = /grammar/$, "'grammar' string";
blockOpen = /\{/$, "{";
blockClose = /\}/$, "}";
labelSeparator = /\:/$, ":";
separator = /\\;/$, ";";
import = /import/$, "import";
importing = /\"[a-zA-Z0-9\\_\\.\\/\\\\]+\"/$, "file name to import";
//lexer lexicon
operandSeparator = /\/$, "";
type = /[a-zA-z][a-zA-Z0-9]*/$, "type name";
skip = /\!/$, "!";
typeAssign = /=/$, "=";
regex = /(?s)(/.*?/\$)/$, "regular expression without space characters";
description = /\".*\"/$, "description";
typeSep = /\;/$, ";";
compositeOpen = /\</$, "<";
compositeClose = /\>/$, ">";
and = /\&/$, "&";
or = /\|/$, "|";
//parser lexicon
ruleName = /[a-zA-Z][a-zA-Z0-9_]*/$, "rule name";
productionSymbol = /=/$, "=";
idSep = /\./$;
terminalPrefix = /\$/$, "terminal prefix";
ruleProduct = /[a-zA-Z][a-zA-Z0-9_]*/$, "rule product";
emptyString = /\#/$, "#";
ruleSeparator = /\;/$, ";";
productionSeparator = /\|/$, "|";
! commentText = /?s/\*.*?\*/|//[^\n]*/$, "comment";
nonSkippable = /[^\s]/$, "not ignorable character";
}
grammar:{
language = $language $labelSeparator $languageName $separator compiler;
compiler = importList lex grammar;
//import
importList = import $separator importList | #;
import = $import $importing;
//lexer rules token types
lex = $lex $labelSeparator $blockOpen lexRuleList $blockClose;
lexRuleList = lexRule $separator lexRuleListEps;
lexRuleListEps = lexRuleList | #;
lexRule = skip $type $typeAssign typeValue description;
//type composing rules
typeValue = $regex;
typeValue = compositeType;
compositeType = $compositeOpen compositeElem compositeTail;
compositeTail = $and compositeElem compositeTail;
compositeTail = $or compositeElem compositeTail;
compositeTail = $compositeClose;
compositeElem = $type;
compositeElem = $regex;
lex_rule_eps = lexRule | #;
skip = $skip | #;
description = $operandSeparator $description | #;
//parser grammar
grammar = $grammar $labelSeparator $blockOpen ruleList $blockClose;
ruleList = rule $separator ruleListEps;
ruleListEps = ruleList | #;
rule = ruleName $productionSymbol product_list;
ruleName = $langId $idSep $ruleName;
ruleName = $ruleName;
product_list = ruleProduct product_list_eps;
product_list = $emptyString;
product_list_eps = ruleProduct product_list_eps;
product_list_eps = $productionSeparator product_list | #;
ruleProduct = terminalPrefix $langId $idSep $ruleProduct;
ruleProduct = terminalPrefix $ruleProduct;
terminalPrefix = $terminalPrefix | #;
}