1 /*
 2  * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
 3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 4  *
 5  * This code is free software; you can redistribute it and/or modify it
 6  * under the terms of the GNU General Public License version 2 only, as
 7  * published by the Free Software Foundation.  Oracle designates this
 8  * particular file as subject to the "Classpath" exception as provided
 9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 package optkl.textmodel;
26 
27 import optkl.textmodel.tokens.At;
28 import optkl.textmodel.tokens.Ch;
29 import optkl.textmodel.tokens.DottedName;
30 import optkl.textmodel.tokens.FloatConst;
31 import optkl.textmodel.tokens.IntConst;
32 import optkl.textmodel.tokens.LeafReplacementToken;
33 import optkl.textmodel.tokens.ReservedWord;
34 import optkl.textmodel.tokens.Seq;
35 import optkl.textmodel.tokens.Token;
36 import optkl.util.Regex;
37 
38 public class JavaTextModel extends TextModel {
39 
40 
41     public static class JavaModifier extends LeafReplacementToken {
42         public static final Regex regex = Regex.of("static|abstract|public|private|protected|final");
43         public JavaModifier(Token t) {
44             super(t);
45         }
46     }
47     public static class JavaType extends LeafReplacementToken  {
48 
49         public static final Regex regex = Regex.of(
50                 "var|if|while|case|switch|break|for|new|import|instanceof|default|return|super|package"
51         );
52 
53         public JavaType(Token t) {
54             super(t);
55         }
56     }
57     public static class JavaAnnotation extends LeafReplacementToken{
58         public JavaAnnotation(Token at, Token identifier) {
59             super(at, identifier);
60         }
61     }
62 
63      public void transform(){
64 
65          replace(t -> Seq.isA(t, $->$.matches(IntConst.regex)), IntConst::new);
66          replace(t -> Seq.isA(t, $->$.matches(FloatConst.regex)), FloatConst::new);
67 
68          // @ (char) -> At
69          replace( Ch::isAnAt, At::new);
70 
71          Regex javaTypes = Regex.of("void|int|float|double|boolean|char|short|long|class|record|interface|String");
72 
73          replace(t -> Seq.isA(t, $->$.matches(javaTypes)), ReservedWord::new);
74 
75          replace(t -> Seq.isA(t, $->$.matches(JavaType.regex)), JavaType::new);
76 
77          replace(t -> Seq.isA(t, $->$.matches(JavaModifier.regex)),JavaModifier::new);
78 
79          // (Seq|Dname) '.' Seq -> Dname
80          replace((t1, t2, t3) -> (Seq.isA(t1) || DottedName.isA(t1)) && Ch.isADot(t2) && Seq.isA(t3),DottedName::new);
81 
82          // map all seqs to DottedName
83          replace(t -> Seq.isA(t, $->$.matches(DottedName.regex)), DottedName::new);
84      }
85     static public JavaTextModel of(String text) {
86         JavaTextModel doc = new JavaTextModel();
87         doc.parse(text);
88         doc.transform();
89         return doc;
90     }
91 }