/
ANTLR2.rsc
136 lines (114 loc) · 5.36 KB
/
ANTLR2.rsc
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
124
125
126
127
128
129
130
131
132
133
134
135
136
module ANTLR2
import util::IDE;
//syntax ANTLRGrammar = Parser Lexer;
syntax ANTLRGrammar = ANTLRParser;
syntax ANTLRParser = "class" ANTLRName "extends" "Parser" ";" ANTLRHeader? ANTLRRule+;
syntax ANTLRHeader = ANTLRHeaderSection* ANTLRSemanticPredicate;
// syntax ANTLRLexer = "class" Name "extends" "Lexer" ";" HeaderSection* CurlyBlock? Rule+;
syntax ANTLRKeywords
= "class" | "extends" | "options" | "tokens" | "fragment" | "protected" | "@header" | "@members" ;
syntax ANTLRHeaderSection = @category="Comment" ANTLRSectionName ANTLRCurlyBlock;
syntax ANTLRSectionName
= "options"
| "tokens"
| "@header"
| "@members"
;
syntax ANTLRRule = ANTLRRulePrefix? ANTLRName ANTLRArguments? ANTLRRuleModifier? ":" ANTLRAlternatives ";";
syntax ANTLRAlternatives = {ANTLRAlternative "|"}+;
syntax ANTLRRulePrefix = "fragment" | "protected";
syntax ANTLRRuleModifier = ANTLRSemanticPredicate | ANTLROptions ANTLRSemanticPredicate?;
syntax ANTLRAlternative = ANTLRSemanticPredicate? ANTLRSyntacticPredicate? ANTLRSymbol* ANTLRRewrite?;// | SemanticPredicate;
syntax ANTLRSymbol
= ANTLRName
| @category="Variable" ANTLRQuotedBlock
| "~"? "(" ANTLRAlternatives ")"
| ANTLRSymbol ANTLRModifier
> ANTLRPrefix ANTLRSymbol
| @category="Variable" ANTLRQuotedBlock ".." ANTLRQuotedBlock
;
syntax ANTLRPrefix
= ANTLRName ":"
| ANTLRUselessPrefix;
syntax ANTLRUselessPrefix
= ANTLROptions ":" ANTLRPredicate?
;
syntax ANTLRPredicate
= ANTLRSyntacticPredicate
| ANTLRSemanticPredicate
;
syntax ANTLRModifier = "*" | "?" | "+" | @category="Comment" ANTLRUselessModifier;
syntax ANTLRUselessModifier = "!" | "^" | ANTLRSemanticPredicate | ANTLRSquareBlock ;
syntax ANTLRName = @category="Constant" lex [A-Za-z0-9_@]+ - ANTLRKeywords # [A-Za-z0-9_@];
syntax ANTLRSyntacticPredicate = @category="Comment" ANTLRParenthesisBlock "=\>";
syntax ANTLRArguments = @category="Comment" ANTLRSquareBlock | "!" ANTLRSquareBlock?;
syntax ANTLRRewrite = @category="Comment" "-\>" ANTLRRewrittenTree;
syntax ANTLRRewrittenTree = "^" ANTLRParenthesisBlock | ANTLRName;
syntax ANTLROptions = @category="Comment" "options" ANTLRCurlyBlock;
syntax ANTLRSemanticPredicate
= @category="Comment" ANTLRCurlyBlock
| @category="Comment" "{" ANTLRCurlyBlockElement* "}" "?";
syntax ANTLRLayout
= lex [\ \t\n\r]
| @category="Comment" lex "//" ![\n]* [\n]
| @category="Comment" lex "/*" ANTLRCommentChar* "*/" ;
syntax ANTLRCommentChar = lex ![*] | lex ANTLRAsterisk ;
syntax ANTLRAsterisk = lex [*] # [/] ;
layout ANTLRLayoutList = lex ANTLRLayout* # [\ \t\n\r] # "/*" # "//";
syntax ANTLRCurlyBlock = "{" ANTLRCurlyBlockElement* "}" # "?";
syntax ANTLRCurlyBlockElement = ![{}] | ANTLRCurlyBlock;
syntax ANTLRSquareBlock = "[" ANTLRSquareBlockElement* "]";
syntax ANTLRSquareBlockElement = ![\[\]] | ANTLRSquareBlock;
syntax ANTLRParenthesisBlock = "(" ANTLRParenthesisBlockElement* ")";
syntax ANTLRParenthesisBlockElement = ![()] | ANTLRParenthesisBlock;
syntax ANTLRQuotedBlock = [\"] ANTLRQuotedBlockSymbol* [\"];
syntax ANTLRQuotedBlockSymbol = lex ![\"\\] | lex [\\][\'rtnuf\\\"];
public ANTLRGrammar agrammar(str i, loc s){return parse(#ANTLRGrammar, i, s);}
public void enableAntlr()
{
registerLanguage("ANTLR2","ag",agrammar);
registerContributions("ANTLR2",{popup(menu("ANTLR",[edit("simplify!", simplify2str)]))});
}
public ANTLRGrammar simplify(ANTLRGrammar g)
{
return innermost visit(g)
{
// "class" Name "extends" "Parser" ";" HeaderSection* SemanticPredicate? Rule+;
case (ANTLRParser)`class <ANTLRName n> extends Parser; <ANTLRHeader _> <ANTLRRule+ rs>`
=> (ANTLRParser)`class <ANTLRName n> extends Parser; <ANTLRRule+ rs>`
// RulePrefix? Name Arguments? RuleModifier? ":" {Alternative "|"}+ ";"
case (ANTLRRule)`<ANTLRRulePrefix _> <ANTLRName n> <ANTLRArguments? _> <ANTLRRuleModifier? _> : <ANTLRAlternatives as>;`
=> (ANTLRRule)`<ANTLRName n>: <ANTLRAlternatives as>;`
case (ANTLRRule)`<ANTLRName n> <ANTLRArguments _> <ANTLRRuleModifier? _> : <ANTLRAlternatives as>;`
=> (ANTLRRule)`<ANTLRName n>: <ANTLRAlternatives as>;`
case (ANTLRRule)`<ANTLRName n> <ANTLRRuleModifier _> : <ANTLRAlternatives as>;`
=> (ANTLRRule)`<ANTLRName n>: <ANTLRAlternatives as>;`
// SemanticPredicate? SyntacticPredicate? Symbol* Rewrite?;
case (ANTLRAlternative)`<ANTLRSemanticPredicate _> <ANTLRSyntacticPredicate? _> <ANTLRSymbol+ ss> <ANTLRRewrite? _>`
=> (ANTLRAlternative)`<ss>`
case (ANTLRAlternative)`<ANTLRSyntacticPredicate _> <ANTLRSymbol+ ss> <ANTLRRewrite? _>`
=> (ANTLRAlternative)`<ss>`
case (ANTLRAlternative)`<ANTLRSymbol+ ss> <ANTLRRewrite _>`
=> (ANTLRAlternative)`<ss>`
// Prefix+ Symbol
case (ANTLRSymbol)`<ANTLRUselessPrefix _> <ANTLRSymbol s>`
=> s
// ANTLRSymbol ANTLRModifier+
case (ANTLRSymbol)`<ANTLRSymbol s> <ANTLRUselessModifier _>`
=> s
// "~"? "(" {Alternative "|"}+ ")"
case (ANTLRSymbol)`~ (<ANTLRAlternatives as>)`
=> (ANTLRSymbol)`(<ANTLRAlternatives as>)`
};
}
public str simplify2str(ANTLRGrammar g, loc z)
{
return "<simplify(g)>";
}
// import SourceEditor;
// import ANTLR;
// registerLanguage("ANTLR","ag",agrammar);
// registerContributions("ANTLR",{popup(menu("ANTLR",[edit("simplify!", simplify2str)]))});
// a=parse(#ANTLRGrammar,|project://antlr/src/Java.ag|);
// writeTextValueFile(|project://antlr/src/Test.ag|,parse(#ANTLRGrammar,|project://antlr/src/Java.ag|));
// writeFile(|project://antlr/src/S1.out.ag|,simplify(parse(#ANTLRGrammar,|project://antlr/src/S1.ag|)));