| 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 | */ |
|---|
| 21 | module com.sun.fortress.parser.Literal(MayNewlineHeader, DelimitedExpr, |
|---|
| 22 | NoSpaceExpr, Symbol, Spacing, |
|---|
| 23 | Identifier); |
|---|
| 24 | |
|---|
| 25 | import MayNewlineHeader; |
|---|
| 26 | import DelimitedExpr; |
|---|
| 27 | import NoSpaceExpr; |
|---|
| 28 | import Symbol; |
|---|
| 29 | import Spacing; |
|---|
| 30 | import Identifier; |
|---|
| 31 | |
|---|
| 32 | /* LiteralExpr ::= |
|---|
| 33 | ( w ) |
|---|
| 34 | | NumericLiteralExpr |
|---|
| 35 | | CharLiteralExpr |
|---|
| 36 | | StringLiteralExpr |
|---|
| 37 | */ |
|---|
| 38 | Expr LiteralExpr = |
|---|
| 39 | <VOID> VoidLiteralExpr |
|---|
| 40 | / <NUMERICAL> NumericLiteralExpr |
|---|
| 41 | / <CHAR>CharLiteralExpr |
|---|
| 42 | / <STRING> StringLiteralExpr |
|---|
| 43 | ; |
|---|
| 44 | |
|---|
| 45 | /* ArrayExpr ::= [ StaticArgs? w RectElements w ] */ |
|---|
| 46 | ArrayExpr 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* */ |
|---|
| 53 | private 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 */ |
|---|
| 62 | com.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 | |
|---|
| 66 | Expr VoidLiteralExpr = |
|---|
| 67 | <FIRST> openparen w closeparen |
|---|
| 68 | { yyValue = ExprFactory.makeVoidLiteralExpr(createSpan(yyStart,yyCount)); }; |
|---|
| 69 | |
|---|
| 70 | NumberLiteralExpr 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 | |
|---|
| 89 | private transient String RestNumericWord = |
|---|
| 90 | a1:NumericSeparator a2:NumericWord { yyValue = a1+a2; }; |
|---|
| 91 | |
|---|
| 92 | transient FloatLiteralExpr FloatLiteralExpr = |
|---|
| 93 | <FIRST> a1:DigitString dot a2:DigitString |
|---|
| 94 | { yyValue = ExprFactory.makeFloatLiteralExpr(createSpan(yyStart,yyCount), |
|---|
| 95 | a1 + "." + a2); }; |
|---|
| 96 | |
|---|
| 97 | transient 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 | |
|---|
| 109 | private transient String NumericCharacter = [0-9a-zA-Z]; |
|---|
| 110 | private 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 | |
|---|
| 121 | private transient String NumericSeparator = "." ; |
|---|
| 122 | |
|---|
| 123 | private transient String RadixSpecifier = |
|---|
| 124 | RadixDigits |
|---|
| 125 | / RadixNames ; |
|---|
| 126 | |
|---|
| 127 | private 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 | |
|---|
| 144 | private 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 | |
|---|
| 161 | private transient String DigitString = [0-9]+; |
|---|
| 162 | |
|---|
| 163 | CharLiteralExpr CharLiteralExpr = |
|---|
| 164 | <FIRST> "'" a1:CharLiteralContent "'" |
|---|
| 165 | { yyValue = ExprFactory.makeCharLiteralExpr(createSpan(yyStart,yyCount), |
|---|
| 166 | a1); |
|---|
| 167 | }; |
|---|
| 168 | |
|---|
| 169 | StringLiteralExpr 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 | }; |
|---|
| 177 | private String StringLiteralContent = |
|---|
| 178 | EscapeSequence |
|---|
| 179 | / a1:(!["\\] _) { yyValue = String.valueOf(a1); }; |
|---|
| 180 | |
|---|
| 181 | private 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 | |
|---|
| 195 | private String CharLiteralContent = |
|---|
| 196 | EscapeSequence |
|---|
| 197 | / a1:(![\\] _) { yyValue = String.valueOf(a1); }; |
|---|