root/trunk/ProjectFortress/src/com/sun/fortress/parser/Literal.rats @ 2327

Revision 2327, 6.1 KB (checked in by sukyoungryu, 16 months ago)

[parser] Rejects numerals ending with apostrophes.

Line 
1/*******************************************************************************
2    Copyright 2008 Sun Microsystems, Inc.,
3    4150 Network Circle, Santa Clara, California 95054, U.S.A.
4    All rights reserved.
5
6    U.S. Government Rights - Commercial software.
7    Government users are subject to the Sun Microsystems, Inc. standard
8    license agreement and applicable provisions of the FAR and its supplements.
9
10    Use is subject to license terms.
11
12    This distribution may include materials developed by third parties.
13
14    Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered
15    trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
16 ******************************************************************************/
17
18/*
19 * Definition of Fortress literals.
20 */
21module com.sun.fortress.parser.Literal(MayNewlineHeader, DelimitedExpr,
22                                       NoSpaceExpr, Symbol, Spacing,
23                                       Identifier);
24
25import MayNewlineHeader;
26import DelimitedExpr;
27import NoSpaceExpr;
28import Symbol;
29import Spacing;
30import Identifier;
31
32/* LiteralExpr ::=
33     ( w )
34   | NumericLiteralExpr
35   | CharLiteralExpr
36   | StringLiteralExpr
37 */
38Expr LiteralExpr =
39   <VOID> VoidLiteralExpr
40   / <NUMERICAL> NumericLiteralExpr
41   / <CHAR>CharLiteralExpr
42   / <STRING> StringLiteralExpr
43   ;
44
45/* ArrayExpr ::= [ StaticArgs? w RectElements w ] */
46ArrayExpr ArrayExpr =
47     void:opensquare a1:StaticArgs? w a2:RectElements w void:closesquare
48     { if (a1 == null) yyValue = a2;
49       else            yyValue = FortressUtil.addStaticArgsToArrayExpr(a1, a2);
50     };
51
52/* RectElements ::= NoSpaceExpr MultiDimCons* */
53private ArrayExpr RectElements =
54     a1:NoSpaceExpr a2s:MultiDimCons*
55     { if (a2s == null || a2s.isEmpty())
56           yyValue = new ArrayElement(a1.getSpan(), false, a1);
57       else
58           yyValue = FortressUtil.multiDimCons(a1, a2s.list());
59     };
60
61/* MultiDimCons ::= RectSeparator NoSpaceExpr */
62com.sun.fortress.useful.Pair<Integer,Expr> MultiDimCons =
63     a1:RectSeparator a2:NoSpaceExpr
64     { yyValue = new com.sun.fortress.useful.Pair<Integer,Expr>(a1,a2); };
65
66Expr VoidLiteralExpr =
67     <FIRST> openparen w closeparen
68     { yyValue = ExprFactory.makeVoidLiteralExpr(createSpan(yyStart,yyCount)); };
69
70NumberLiteralExpr NumericLiteralExpr =
71    a1:NumericWord a2s:RestNumericWord+ "_" a3:RadixSpecifier &{ NodeUtil.validNumericLiteral(a1, a2s.list(), a3) }
72    { String numeral = a1;
73      for (String numericWord: a2s.list()) {
74          numeral += numericWord;
75      }
76      yyValue = ExprFactory.makeFloatLiteralExpr(createSpan(yyStart,yyCount),
77                                                 numeral+"_"+NodeUtil.radix2Number(a3));
78    }
79  / a1:NumericWord a2s:RestNumericWord+ &{ NodeUtil.validNumericLiteral(a1, a2s.size()) }
80    { String numeral = a1;
81      for (String numericWord: a2s.list()) {
82          numeral += numericWord;
83      }
84      yyValue = ExprFactory.makeFloatLiteralExpr(createSpan(yyStart,yyCount), numeral);
85    }
86  / FloatLiteralExpr
87  / IntLiteralExpr ;
88
89private transient String RestNumericWord =
90    a1:NumericSeparator a2:NumericWord { yyValue = a1+a2; };
91
92transient FloatLiteralExpr FloatLiteralExpr =
93    <FIRST> a1:DigitString dot a2:DigitString
94    { yyValue = ExprFactory.makeFloatLiteralExpr(createSpan(yyStart,yyCount),
95                                                 a1 + "." + a2); };
96
97transient IntLiteralExpr IntLiteralExpr =
98    <FIRST> a1:NumericWord "_" a2:RadixSpecifier &{ NodeUtil.validNumericLiteral(a1, a2) }
99    { Span span = createSpan(yyStart,yyCount);
100      yyValue = ExprFactory.makeIntLiteralExpr(span, a1+"_"+NodeUtil.radix2Number(a2));
101    }
102  / a1:NumericWord &{ NodeUtil.validNumericLiteral(a1) }
103    { yyValue = ExprFactory.makeIntLiteralExpr(createSpan(yyStart,yyCount), a1); }
104  / a1:DigitString
105    { yyValue = ExprFactory.makeIntLiteralExpr(createSpan(yyStart,yyCount),
106                                               a1);
107    };
108
109private transient String NumericCharacter = [0-9a-zA-Z];
110private transient String NumericWord =
111    a1s:NumericCharacter+ a2s:("'" / NumericCharacter)* &{ NodeUtil.validNumericWord(a2s.list()) }
112    { yyValue = "";
113      for (String n: a1s.list()) {
114          yyValue += n;
115      }
116      for (String n: a2s.list()) {
117          yyValue += n;
118      }
119    };
120
121private transient String NumericSeparator = "." ;
122
123private transient String RadixSpecifier =
124     RadixDigits
125   / RadixNames ;
126
127private transient String RadixDigits =
128     "16"
129   / "15"
130   / "14"
131   / "13"
132   / "12"
133   / "11"
134   / "10"
135   / "9"
136   / "8"
137   / "7"
138   / "6"
139   / "5"
140   / "4"
141   / "3"
142   / "2" ;
143
144private transient String RadixNames =
145     "SIXTEEN"
146   / "FIFTEEN"
147   / "FOURTEEN"
148   / "THIRTEEN"
149   / "TWELVE"
150   / "ELEVEN"
151   / "TEN"
152   / "NINE"
153   / "EIGHT"
154   / "SEVEN"
155   / "SIX"
156   / "FIVE"
157   / "FOUR"
158   / "THREE"
159   / "TWO" ;
160
161private transient String DigitString = [0-9]+;
162
163CharLiteralExpr CharLiteralExpr =
164     <FIRST> "'" a1:CharLiteralContent "'"
165     { yyValue = ExprFactory.makeCharLiteralExpr(createSpan(yyStart,yyCount),
166                                                 a1);
167     };
168
169StringLiteralExpr StringLiteralExpr =
170     <FIRST> ["] a1:StringLiteralContent* ["]
171     { String str = "";
172       for (String c : (List<String>)a1.list()) {
173           str = str.concat(c);
174       }
175       yyValue = new StringLiteralExpr(createSpan(yyStart,yyCount), false, str);
176     };
177private String StringLiteralContent =
178     EscapeSequence
179   / a1:(!["\\] _) { yyValue = String.valueOf(a1); };
180
181private String EscapeSequence = '\\' a1:[btnfr"\\]
182     { switch (a1) {
183           case 'b': { yyValue = "\b"; break; }
184           case 't': { yyValue = "\t"; break; }
185           case 'n': { yyValue = "\n"; break; }
186           case 'f': { yyValue = "\f"; break; }
187           case 'r': { yyValue = "\r"; break; }
188           case '"': { yyValue = "\""; break; }
189           case '\'': { yyValue = "\'"; break; }
190           case '\\': { yyValue = "\\"; break; }
191           default: { yyValue = ""; }
192       }
193     };
194
195private String CharLiteralContent =
196     EscapeSequence
197   / a1:(![\\] _) { yyValue = String.valueOf(a1); };
Note: See TracBrowser for help on using the browser.