1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-05 15:25:49 +02:00

[273283] [XLC Parser] support _Complex and restrict keywords in C++

This commit is contained in:
Mike Kucera 2009-04-22 15:26:09 +00:00
parent 91657617cb
commit 6262b1fe81
18 changed files with 3579 additions and 3341 deletions

View file

@ -964,10 +964,14 @@ elaborated_specifier_hook
-- ::= identifier_token -- ::= identifier_token
comma_opt
::= ',' | $empty
enum_specifier enum_specifier
::= 'enum' enum_specifier_hook '{' <openscope-ast> enumerator_list_opt '}' ::= 'enum' enum_specifier_hook '{' <openscope-ast> enumerator_list_opt comma_opt '}'
/. $Build consumeTypeSpecifierEnumeration(false); $EndBuild ./ /. $Build consumeTypeSpecifierEnumeration(false); $EndBuild ./
| 'enum' enum_specifier_hook identifier_token '{' <openscope-ast> enumerator_list_opt '}' | 'enum' enum_specifier_hook identifier_token '{' <openscope-ast> enumerator_list_opt comma_opt '}'
/. $Build consumeTypeSpecifierEnumeration(true); $EndBuild ./ /. $Build consumeTypeSpecifierEnumeration(true); $EndBuild ./
enum_specifier_hook enum_specifier_hook

View file

@ -10,6 +10,9 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.parser.xlc.tests; package org.eclipse.cdt.core.parser.xlc.tests;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPref;
public class XLCExtensionsTest extends XLCTestBase { public class XLCExtensionsTest extends XLCTestBase {
@ -218,11 +221,18 @@ public class XLCExtensionsTest extends XLCTestBase {
parse(code, getCLanguage(), true); parse(code, getCLanguage(), true);
} }
public void testRestrictCPP() {
public void testRestrictCPPOn() {
String code =
"void foo(int n, int * restrict a, int * __restrict b, int * __restrict__ c) {} ";
parse(code, getCPPLanguage(), true);
}
public void testRestrictCPPOff() {
XlcLanguagePreferences.setWorkspacePreference(XlcPref.SUPPORT_RESTRICT_IN_CPP, String.valueOf(false));
String code = String code =
"void restrict(); \n " + "void restrict(); \n " +
"void __restrict(); \n " + "void foo(int n, int * __restrict b, int * __restrict__ c) {} ";
"void __restrict__(); \n ";
parse(code, getCPPLanguage(), true); parse(code, getCPPLanguage(), true);
} }
@ -244,7 +254,7 @@ public class XLCExtensionsTest extends XLCTestBase {
} }
public void testFloatingPoingTypes() { public void testFloatingPointTypes() {
String code = String code =
" _Decimal32 x = 22.2df; \n " + " _Decimal32 x = 22.2df; \n " +
" _Decimal64 y = 33.3dd; \n " + " _Decimal64 y = 33.3dd; \n " +

View file

@ -38,12 +38,29 @@ $Define
$End $End
$Terminals
_Complex
restrict
$End
$Start $Start
translation_unit translation_unit
$End $End
$Rules $Rules
simple_type_specifier_token
::= '_Complex'
cv_qualifier
::= 'restrict'
block_declaration block_declaration
::= vector_declaration ::= vector_declaration

View file

@ -10,6 +10,9 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.lrparser.xlc; package org.eclipse.cdt.core.lrparser.xlc;
import static org.eclipse.cdt.core.lrparser.xlc.XlcCPPLanguage.getPref;
import static org.eclipse.cdt.core.lrparser.xlc.XlcCPPLanguage.getProject;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
@ -17,8 +20,7 @@ import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.gnu.GCCLanguage; import org.eclipse.cdt.core.dom.lrparser.gnu.GCCLanguage;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPref;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPreferenceKeys;
import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.internal.core.lrparser.xlc.c.XlcCParser; import org.eclipse.cdt.internal.core.lrparser.xlc.c.XlcCParser;
@ -40,9 +42,9 @@ public class XlcCLanguage extends GCCLanguage {
@Override @Override
protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Map<String,String> properties) { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Map<String,String> properties) {
IProject project = XlcCPPLanguage.getProject(properties); IProject project = getProject(properties);
boolean supportVectors = Boolean.valueOf(XlcLanguagePreferences.get(XlcPreferenceKeys.KEY_SUPPORT_VECTOR_TYPES, project)); boolean supportVectors = getPref(XlcPref.SUPPORT_VECTOR_TYPES, project);
boolean supportDecimals = Boolean.valueOf(XlcLanguagePreferences.get(XlcPreferenceKeys.KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES, project)); boolean supportDecimals = getPref(XlcPref.SUPPORT_DECIMAL_FLOATING_POINT_TYPES, project);
return new XlcCParser(scanner, new XlcCTokenMap(supportVectors, supportDecimals), getBuiltinBindingsProvider(), index, properties); return new XlcCParser(scanner, new XlcCTokenMap(supportVectors, supportDecimals), getBuiltinBindingsProvider(), index, properties);
} }

View file

@ -13,13 +13,14 @@ package org.eclipse.cdt.core.lrparser.xlc;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.LRParserProperties; import org.eclipse.cdt.core.dom.lrparser.LRParserProperties;
import org.eclipse.cdt.core.dom.lrparser.gnu.GPPLanguage; import org.eclipse.cdt.core.dom.lrparser.gnu.GPPLanguage;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPreferenceKeys; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPref;
import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.internal.core.lrparser.xlc.cpp.XlcCPPParser; import org.eclipse.cdt.internal.core.lrparser.xlc.cpp.XlcCPPParser;
@ -57,17 +58,25 @@ public class XlcCPPLanguage extends GPPLanguage {
} }
static boolean getPref(XlcPref key, IProject project) {
return Boolean.valueOf(XlcLanguagePreferences.get(key, project));
}
@Override @Override
protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Map<String,String> properties) { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Map<String,String> properties) {
IProject project = getProject(properties); IProject project = getProject(properties);
boolean supportVectors = Boolean.valueOf(XlcLanguagePreferences.get(XlcPreferenceKeys.KEY_SUPPORT_VECTOR_TYPES, project)); boolean supportVectors = getPref(XlcPref.SUPPORT_VECTOR_TYPES, project);
boolean supportDecimals = Boolean.valueOf(XlcLanguagePreferences.get(XlcPreferenceKeys.KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES, project)); boolean supportDecimals = getPref(XlcPref.SUPPORT_DECIMAL_FLOATING_POINT_TYPES, project);
boolean supportComplex = getPref(XlcPref.SUPPORT_COMPLEX_IN_CPP, project);
boolean supportRestrict = getPref(XlcPref.SUPPORT_RESTRICT_IN_CPP, project);
IDOMTokenMap tokenMap = new XlcCPPTokenMap(supportVectors, supportDecimals, supportComplex, supportRestrict);
XlcCPPParser parser = new XlcCPPParser(scanner, tokenMap, getBuiltinBindingsProvider(), index, properties);
XlcCPPParser parser = new XlcCPPParser(scanner, new XlcCPPTokenMap(supportVectors, supportDecimals), getBuiltinBindingsProvider(), index, properties);
return parser; return parser;
} }
public String getId() { public String getId() {
return ID; return ID;
} }

View file

@ -16,7 +16,6 @@ import static org.eclipse.cdt.internal.core.lrparser.xlc.cpp.XlcCPPParsersym.*;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap; import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.parser.IGCCToken; import org.eclipse.cdt.core.parser.IGCCToken;
import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* Maps tokens types returned by CPreprocessor to token types * Maps tokens types returned by CPreprocessor to token types
@ -28,8 +27,8 @@ public class XlcCPPTokenMap implements IDOMTokenMap {
private final XlcKeywords keywordMap; private final XlcKeywords keywordMap;
public XlcCPPTokenMap(boolean supportVectors, boolean supportDecimalFloatingPoint) { public XlcCPPTokenMap(boolean supportVectors, boolean supportDecimalFloatingPoint, boolean supportComplex, boolean supportRestrict) {
keywordMap = new XlcKeywords(ParserLanguage.CPP, supportVectors, supportDecimalFloatingPoint); keywordMap = XlcKeywords.createCPP(supportVectors, supportDecimalFloatingPoint, supportComplex, supportRestrict);
} }

View file

@ -16,7 +16,6 @@ import static org.eclipse.cdt.internal.core.lrparser.xlc.c.XlcCParsersym.*;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap; import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.parser.IGCCToken; import org.eclipse.cdt.core.parser.IGCCToken;
import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ParserLanguage;
/** /**
* Maps tokens types returned by CPreprocessor to token types * Maps tokens types returned by CPreprocessor to token types
@ -29,7 +28,7 @@ public final class XlcCTokenMap implements IDOMTokenMap {
private final XlcKeywords keywordMap; private final XlcKeywords keywordMap;
public XlcCTokenMap(boolean supportVectors, boolean supportDecimalFloatingPoint) { public XlcCTokenMap(boolean supportVectors, boolean supportDecimalFloatingPoint) {
keywordMap = new XlcKeywords(ParserLanguage.C, supportVectors, supportDecimalFloatingPoint); keywordMap = XlcKeywords.createC(supportVectors, supportDecimalFloatingPoint);
} }

View file

@ -23,46 +23,63 @@ import org.eclipse.cdt.internal.core.lrparser.xlc.cpp.XlcCPPParsersym;
public class XlcKeywords extends CLanguageKeywords { public class XlcKeywords extends CLanguageKeywords {
public static final XlcKeywords ALL_C_KEYWORDS = new XlcKeywords(ParserLanguage.C, true, true); public static final XlcKeywords ALL_C_KEYWORDS = createC(true, true);
public static final XlcKeywords ALL_CPP_KEYWORDS = new XlcKeywords(ParserLanguage.CPP, true, true); public static final XlcKeywords ALL_CPP_KEYWORDS = createCPP(true, true, true, true);
private final CharArrayMap<Integer> map = new CharArrayMap<Integer>(); private final CharArrayMap<Integer> map = new CharArrayMap<Integer>();
private final ParserLanguage language; private final ParserLanguage language;
private String[] allKeywords = null; private String[] allKeywords = null;
public XlcKeywords(ParserLanguage language, boolean supportVectors, boolean supportDeclimalFloatingPoint) {
public static XlcKeywords createC(boolean supportVectors, boolean supportDecimalFloatingPoint) {
XlcKeywords keywords = new XlcKeywords(ParserLanguage.C);
CharArrayMap<Integer> map = keywords.map;
if(supportVectors) {
map.put("vector".toCharArray(), XlcCParsersym.TK_vector);
map.put("__vector".toCharArray(), XlcCParsersym.TK_vector);
map.put("pixel".toCharArray(), XlcCParsersym.TK_pixel);
map.put("__pixel".toCharArray(), XlcCParsersym.TK_pixel);
map.put("bool".toCharArray(), XlcCParsersym.TK_bool);
}
if(supportDecimalFloatingPoint) {
map.put("_Decimal32".toCharArray(), XlcCParsersym.TK__Decimal32);
map.put("_Decimal64".toCharArray(), XlcCParsersym.TK__Decimal64);
map.put("_Decimal128".toCharArray(), XlcCParsersym.TK__Decimal128);
}
return keywords;
}
public static XlcKeywords createCPP(boolean supportVectors, boolean supportDecimalFloatingPoint, boolean supportComplex, boolean supportRestrict) {
XlcKeywords keywords = new XlcKeywords(ParserLanguage.CPP);
CharArrayMap<Integer> map = keywords.map;
if(supportVectors) {
map.put("vector".toCharArray(), XlcCPPParsersym.TK_vector);
map.put("__vector".toCharArray(), XlcCPPParsersym.TK_vector);
map.put("pixel".toCharArray(), XlcCPPParsersym.TK_pixel);
map.put("__pixel".toCharArray(), XlcCPPParsersym.TK_pixel);
}
if(supportDecimalFloatingPoint) {
map.put("_Decimal32".toCharArray(), XlcCPPParsersym.TK__Decimal32);
map.put("_Decimal64".toCharArray(), XlcCPPParsersym.TK__Decimal64);
map.put("_Decimal128".toCharArray(), XlcCPPParsersym.TK__Decimal128);
}
if(supportComplex) {
map.put("_Complex".toCharArray(), XlcCPPParsersym.TK__Complex);
}
if(supportRestrict) {
map.put("restrict".toCharArray(), XlcCPPParsersym.TK_restrict);
map.put("__restrict".toCharArray(), XlcCPPParsersym.TK_restrict);
map.put("__restrict__".toCharArray(), XlcCPPParsersym.TK_restrict);
}
return keywords;
}
private XlcKeywords(ParserLanguage language) {
super(language, XlcScannerExtensionConfiguration.getInstance()); super(language, XlcScannerExtensionConfiguration.getInstance());
this.language = language; this.language = language;
if(language.isCPP()) {
if(supportVectors) {
map.put("vector".toCharArray(), XlcCPPParsersym.TK_vector);
map.put("__vector".toCharArray(), XlcCPPParsersym.TK_vector);
map.put("pixel".toCharArray(), XlcCPPParsersym.TK_pixel);
map.put("__pixel".toCharArray(), XlcCPPParsersym.TK_pixel);
}
if(supportDeclimalFloatingPoint) {
map.put("_Decimal32".toCharArray(), XlcCPPParsersym.TK__Decimal32);
map.put("_Decimal64".toCharArray(), XlcCPPParsersym.TK__Decimal64);
map.put("_Decimal128".toCharArray(), XlcCPPParsersym.TK__Decimal128);
}
}
else {
if(supportVectors) {
map.put("vector".toCharArray(), XlcCParsersym.TK_vector);
map.put("__vector".toCharArray(), XlcCParsersym.TK_vector);
map.put("pixel".toCharArray(), XlcCParsersym.TK_pixel);
map.put("__pixel".toCharArray(), XlcCParsersym.TK_pixel);
map.put("bool".toCharArray(), XlcCParsersym.TK_bool);
}
if(supportDeclimalFloatingPoint) {
map.put("_Decimal32".toCharArray(), XlcCParsersym.TK__Decimal32);
map.put("_Decimal64".toCharArray(), XlcCParsersym.TK__Decimal64);
map.put("_Decimal128".toCharArray(), XlcCParsersym.TK__Decimal128);
}
}
} }
/** /**

View file

@ -30,4 +30,8 @@ public class XlcScannerExtensionConfiguration extends GCCScannerExtensionConfigu
return true; return true;
} }
@Override
public char[] supportAdditionalNumericLiteralSuffixes() {
return "dfl".toCharArray(); //$NON-NLS-1$
}
} }

View file

@ -31,47 +31,48 @@ public class XlcLanguagePreferences {
static void initializeDefaultPreferences() { static void initializeDefaultPreferences() {
Preferences prefs = getDefaultPreferences(); Preferences defaultNode = getDefaultPreferences();
prefs.putBoolean(XlcPreferenceKeys.KEY_SUPPORT_VECTOR_TYPES, true);
prefs.putBoolean(XlcPreferenceKeys.KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES, true);
}
public static void setProjectPreference(String key, String value, IProject project) { for(XlcPref p : XlcPref.values()) {
getProjectPreferences(project).put(key, value); defaultNode.put(p.toString(), p.getDefaultValue());
}
} }
public static void setWorkspacePreference(String key, String value) {
getWorkspacePreferences().put(key, value); public static void setProjectPreference(XlcPref key, String value, IProject project) {
getProjectPreferences(project).put(key.toString(), value);
}
public static void setWorkspacePreference(XlcPref key, String value) {
getWorkspacePreferences().put(key.toString(), value);
} }
public static String getProjectPreference(String key, IProject project) {
return getProjectPreferences(project).get(key, null); public static String getProjectPreference(XlcPref key, IProject project) {
return getProjectPreferences(project).get(key.toString(), null);
} }
public static String getWorkspacePreference(XlcPref key) {
public static String getWorkspacePreference(String key) { return getWorkspacePreferences().get(key.toString(), null);
return getWorkspacePreferences().get(key, null);
} }
public static String getDefaultPreference(String key) { public static String getDefaultPreference(XlcPref key) {
return getDefaultPreferences().get(key, null); return getDefaultPreferences().get(key.toString(), null);
} }
/** /**
* Returns the preference for the given key. * Returns the preference for the given key.
* *
* @param project If null then just the workspace and default preferences will be checked. * @param project If null then just the workspace and default preferences will be checked.
*/ */
public static String get(String key, IProject project) { public static String get(XlcPref key, IProject project) {
return Platform.getPreferencesService().get(key, null, getPreferences(key, project)); return Platform.getPreferencesService().get(key.toString(), null, getPreferences(project));
} }
private static Preferences[] getPreferences(String key, IProject project) { private static Preferences[] getPreferences(IProject project) {
if(project == null) { if(project == null) {
return new Preferences[] { return new Preferences[] {
getWorkspacePreferences(), getWorkspacePreferences(),

View file

@ -11,12 +11,25 @@
package org.eclipse.cdt.core.lrparser.xlc.preferences; package org.eclipse.cdt.core.lrparser.xlc.preferences;
public final class XlcPreferenceKeys { public enum XlcPref {
private XlcPreferenceKeys() {}
public static final String KEY_SUPPORT_VECTOR_TYPES = "vectorTypes"; SUPPORT_VECTOR_TYPES("true"),
SUPPORT_DECIMAL_FLOATING_POINT_TYPES("true"),
SUPPORT_COMPLEX_IN_CPP("true"),
SUPPORT_RESTRICT_IN_CPP("true");
public static final String KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES = "floatingPointTypes";
private final String defaultVal;
private XlcPref(String defaultVal) {
this.defaultVal = defaultVal;
}
public String getDefaultValue() {
return defaultVal;
}
} }

View file

@ -23,23 +23,23 @@ public interface XlcCPPParsersym {
TK_bool = 15, TK_bool = 15,
TK_break = 88, TK_break = 88,
TK_case = 89, TK_case = 89,
TK_catch = 132, TK_catch = 133,
TK_char = 16, TK_char = 16,
TK_class = 53, TK_class = 52,
TK_const = 33, TK_const = 32,
TK_const_cast = 55, TK_const_cast = 55,
TK_continue = 90, TK_continue = 90,
TK_default = 91, TK_default = 91,
TK_delete = 81, TK_delete = 82,
TK_do = 92, TK_do = 92,
TK_double = 26, TK_double = 26,
TK_dynamic_cast = 56, TK_dynamic_cast = 56,
TK_else = 135, TK_else = 135,
TK_enum = 68, TK_enum = 57,
TK_explicit = 38, TK_explicit = 38,
TK_export = 93, TK_export = 93,
TK_extern = 39, TK_extern = 39,
TK_false = 57, TK_false = 58,
TK_float = 17, TK_float = 17,
TK_for = 94, TK_for = 94,
TK_friend = 40, TK_friend = 40,
@ -49,66 +49,66 @@ public interface XlcCPPParsersym {
TK_int = 18, TK_int = 18,
TK_long = 19, TK_long = 19,
TK_mutable = 42, TK_mutable = 42,
TK_namespace = 71, TK_namespace = 73,
TK_new = 82, TK_new = 83,
TK_operator = 12, TK_operator = 12,
TK_private = 116, TK_private = 130,
TK_protected = 117, TK_protected = 131,
TK_public = 118, TK_public = 132,
TK_register = 43, TK_register = 43,
TK_reinterpret_cast = 58, TK_reinterpret_cast = 59,
TK_return = 97, TK_return = 97,
TK_short = 20, TK_short = 20,
TK_signed = 21, TK_signed = 21,
TK_sizeof = 59, TK_sizeof = 60,
TK_static = 44, TK_static = 44,
TK_static_cast = 60, TK_static_cast = 61,
TK_struct = 69, TK_struct = 62,
TK_switch = 98, TK_switch = 98,
TK_template = 52, TK_template = 53,
TK_this = 61, TK_this = 63,
TK_throw = 76, TK_throw = 78,
TK_try = 84, TK_try = 84,
TK_true = 62, TK_true = 64,
TK_typedef = 45, TK_typedef = 45,
TK_typeid = 63, TK_typeid = 65,
TK_typename = 22, TK_typename = 23,
TK_union = 70, TK_union = 66,
TK_unsigned = 23, TK_unsigned = 22,
TK_using = 74, TK_using = 74,
TK_virtual = 36, TK_virtual = 36,
TK_void = 27, TK_void = 27,
TK_volatile = 34, TK_volatile = 33,
TK_wchar_t = 28, TK_wchar_t = 28,
TK_while = 87, TK_while = 87,
TK_integer = 64, TK_integer = 67,
TK_floating = 65, TK_floating = 68,
TK_charconst = 66, TK_charconst = 69,
TK_stringlit = 47, TK_stringlit = 49,
TK_identifier = 1, TK_identifier = 1,
TK_Completion = 4, TK_Completion = 4,
TK_EndOfCompletion = 11, TK_EndOfCompletion = 11,
TK_Invalid = 136, TK_Invalid = 136,
TK_LeftBracket = 77, TK_LeftBracket = 75,
TK_LeftParen = 5, TK_LeftParen = 5,
TK_Dot = 133, TK_Dot = 129,
TK_DotStar = 103, TK_DotStar = 103,
TK_Arrow = 119, TK_Arrow = 116,
TK_ArrowStar = 102, TK_ArrowStar = 102,
TK_PlusPlus = 50, TK_PlusPlus = 50,
TK_MinusMinus = 51, TK_MinusMinus = 51,
TK_And = 14, TK_And = 14,
TK_Star = 13, TK_Star = 13,
TK_Plus = 48, TK_Plus = 47,
TK_Minus = 49, TK_Minus = 48,
TK_Tilde = 10, TK_Tilde = 10,
TK_Bang = 54, TK_Bang = 54,
TK_Slash = 104, TK_Slash = 104,
TK_Percent = 105, TK_Percent = 105,
TK_RightShift = 99, TK_RightShift = 99,
TK_LeftShift = 100, TK_LeftShift = 100,
TK_LT = 72, TK_LT = 71,
TK_GT = 83, TK_GT = 81,
TK_LE = 106, TK_LE = 106,
TK_GE = 107, TK_GE = 107,
TK_EQ = 108, TK_EQ = 108,
@ -117,29 +117,29 @@ public interface XlcCPPParsersym {
TK_Or = 111, TK_Or = 111,
TK_AndAnd = 112, TK_AndAnd = 112,
TK_OrOr = 113, TK_OrOr = 113,
TK_Question = 120, TK_Question = 117,
TK_Colon = 80, TK_Colon = 80,
TK_ColonColon = 6, TK_ColonColon = 6,
TK_DotDotDot = 101, TK_DotDotDot = 101,
TK_Assign = 85, TK_Assign = 85,
TK_StarAssign = 121, TK_StarAssign = 118,
TK_SlashAssign = 122, TK_SlashAssign = 119,
TK_PercentAssign = 123, TK_PercentAssign = 120,
TK_PlusAssign = 124, TK_PlusAssign = 121,
TK_MinusAssign = 125, TK_MinusAssign = 122,
TK_RightShiftAssign = 126, TK_RightShiftAssign = 123,
TK_LeftShiftAssign = 127, TK_LeftShiftAssign = 124,
TK_AndAssign = 128, TK_AndAssign = 125,
TK_CaretAssign = 129, TK_CaretAssign = 126,
TK_OrAssign = 130, TK_OrAssign = 127,
TK_Comma = 79, TK_Comma = 79,
TK_RightBracket = 131, TK_RightBracket = 128,
TK_RightParen = 78, TK_RightParen = 76,
TK_RightBrace = 86, TK_RightBrace = 86,
TK_SemiColon = 46, TK_SemiColon = 46,
TK_LeftBrace = 73, TK_LeftBrace = 72,
TK_typeof = 32, TK_typeof = 34,
TK___alignof__ = 67, TK___alignof__ = 70,
TK___attribute__ = 8, TK___attribute__ = 8,
TK___declspec = 9, TK___declspec = 9,
TK_MAX = 114, TK_MAX = 114,
@ -149,7 +149,7 @@ public interface XlcCPPParsersym {
TK__Decimal32 = 29, TK__Decimal32 = 29,
TK__Decimal64 = 30, TK__Decimal64 = 30,
TK__Decimal128 = 31, TK__Decimal128 = 31,
TK_ERROR_TOKEN = 75, TK_ERROR_TOKEN = 77,
TK_EOF_TOKEN = 134; TK_EOF_TOKEN = 134;
public final static String orderedTerminalSymbols[] = { public final static String orderedTerminalSymbols[] = {
@ -175,8 +175,8 @@ public interface XlcCPPParsersym {
"long", "long",
"short", "short",
"signed", "signed",
"typename",
"unsigned", "unsigned",
"typename",
"_Complex", "_Complex",
"_Imaginary", "_Imaginary",
"double", "double",
@ -185,9 +185,9 @@ public interface XlcCPPParsersym {
"_Decimal32", "_Decimal32",
"_Decimal64", "_Decimal64",
"_Decimal128", "_Decimal128",
"typeof",
"const", "const",
"volatile", "volatile",
"typeof",
"restrict", "restrict",
"virtual", "virtual",
"auto", "auto",
@ -200,43 +200,43 @@ public interface XlcCPPParsersym {
"static", "static",
"typedef", "typedef",
"SemiColon", "SemiColon",
"stringlit",
"Plus", "Plus",
"Minus", "Minus",
"stringlit",
"PlusPlus", "PlusPlus",
"MinusMinus", "MinusMinus",
"template",
"class", "class",
"template",
"Bang", "Bang",
"const_cast", "const_cast",
"dynamic_cast", "dynamic_cast",
"enum",
"false", "false",
"reinterpret_cast", "reinterpret_cast",
"sizeof", "sizeof",
"static_cast", "static_cast",
"struct",
"this", "this",
"true", "true",
"typeid", "typeid",
"union",
"integer", "integer",
"floating", "floating",
"charconst", "charconst",
"__alignof__", "__alignof__",
"enum",
"struct",
"union",
"namespace",
"LT", "LT",
"LeftBrace", "LeftBrace",
"namespace",
"using", "using",
"ERROR_TOKEN",
"throw",
"LeftBracket", "LeftBracket",
"RightParen", "RightParen",
"ERROR_TOKEN",
"throw",
"Comma", "Comma",
"Colon", "Colon",
"GT",
"delete", "delete",
"new", "new",
"GT",
"try", "try",
"Assign", "Assign",
"RightBrace", "RightBrace",
@ -269,9 +269,6 @@ public interface XlcCPPParsersym {
"OrOr", "OrOr",
"MAX", "MAX",
"MIN", "MIN",
"private",
"protected",
"public",
"Arrow", "Arrow",
"Question", "Question",
"StarAssign", "StarAssign",
@ -285,8 +282,11 @@ public interface XlcCPPParsersym {
"CaretAssign", "CaretAssign",
"OrAssign", "OrAssign",
"RightBracket", "RightBracket",
"catch",
"Dot", "Dot",
"private",
"protected",
"public",
"catch",
"EOF_TOKEN", "EOF_TOKEN",
"else", "else",
"Invalid" "Invalid"

View file

@ -0,0 +1,49 @@
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.lrparser.xlc.ui.preferences;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPref;
import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
/**
* A simple wrapper for a checkbox.
*
*/
class PrefCheckbox {
private final XlcPref key;
private final Button button;
PrefCheckbox(Composite parent, XlcPref prefKey, String label) {
button = ControlFactory.createCheckBox(parent, label);
key = prefKey;
}
public XlcPref getKey() {
return key;
}
public void setSelection(boolean selection) {
button.setSelection(selection);
}
public boolean getSelection() {
return button.getSelection();
}
public void setDefault() {
setSelection(Boolean.valueOf(XlcLanguagePreferences.getDefaultPreference(key)));
}
}

View file

@ -10,6 +10,8 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.core.lrparser.xlc.ui.preferences; package org.eclipse.cdt.internal.core.lrparser.xlc.ui.preferences;
import java.lang.reflect.Field;
import org.eclipse.osgi.util.NLS; import org.eclipse.osgi.util.NLS;
public class PreferenceMessages extends NLS { public class PreferenceMessages extends NLS {
@ -19,15 +21,33 @@ public class PreferenceMessages extends NLS {
private PreferenceMessages() {} private PreferenceMessages() {}
static { static {
NLS.initializeMessages(BUNDLE_NAME, PreferenceMessages.class); initializeMessages(BUNDLE_NAME, PreferenceMessages.class);
}
public static final String PREFIX = "XlcLanguageOptionsPreferencePage_";
public static String getMessage(String suffix) {
try {
Field field = PreferenceMessages.class.getDeclaredField(PREFIX + suffix);
return (String)field.get(null);
} catch (NoSuchFieldException e) {
return null;
} catch (IllegalAccessException e) {
return null;
}
} }
public static String public static String
XlcLanguageOptionsPreferencePage_link, XlcLanguageOptionsPreferencePage_link,
XlcLanguageOptionsPreferencePage_group, XlcLanguageOptionsPreferencePage_group,
XlcLanguageOptionsPreferencePage_preference_vectors,
XlcLanguageOptionsPreferencePage_preference_decimals; XlcLanguageOptionsPreferencePage_SUPPORT_VECTOR_TYPES,
XlcLanguageOptionsPreferencePage_SUPPORT_DECIMAL_FLOATING_POINT_TYPES,
XlcLanguageOptionsPreferencePage_SUPPORT_COMPLEX_IN_CPP,
XlcLanguageOptionsPreferencePage_SUPPORT_RESTRICT_IN_CPP;
} }

View file

@ -2,6 +2,8 @@
XlcLanguageOptionsPreferencePage_link=These settings are project-specific. The settings listed here override <a href="org.eclipse.cdt.core.lrparser.xlc.ui.XlcLanguagePreferencePage">workspace-wide</a> language settings. XlcLanguageOptionsPreferencePage_link=These settings are project-specific. The settings listed here override <a href="org.eclipse.cdt.core.lrparser.xlc.ui.XlcLanguagePreferencePage">workspace-wide</a> language settings.
XlcLanguageOptionsPreferencePage_group=Support For XL C/C++ Language Extensions XlcLanguageOptionsPreferencePage_group=Support For XL C/C++ Language Extensions
XlcLanguageOptionsPreferencePage_preference_vectors=Allow vector type declarations XlcLanguageOptionsPreferencePage_SUPPORT_VECTOR_TYPES=Allow vector type declarations
XlcLanguageOptionsPreferencePage_preference_decimals=Allow decimal floating-point types (_Decimal32, _Decimal64, _Decimal128) XlcLanguageOptionsPreferencePage_SUPPORT_DECIMAL_FLOATING_POINT_TYPES=Allow decimal floating-point types (_Decimal32, _Decimal64, _Decimal128)
XlcLanguageOptionsPreferencePage_SUPPORT_COMPLEX_IN_CPP=Allow complex type in C++ (_Complex)
XlcLanguageOptionsPreferencePage_SUPPORT_RESTRICT_IN_CPP=Allow 'restrict' keyword in C++ (restrict, __restrict, __restrict__)

View file

@ -13,13 +13,12 @@ package org.eclipse.cdt.internal.core.lrparser.xlc.ui.preferences;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcLanguagePreferences;
import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPreferenceKeys; import org.eclipse.cdt.core.lrparser.xlc.preferences.XlcPref;
import org.eclipse.cdt.utils.ui.controls.ControlFactory; import org.eclipse.cdt.utils.ui.controls.ControlFactory;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT; import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Event;
@ -38,9 +37,22 @@ import org.eclipse.ui.dialogs.PreferencesUtil;
public class XlcLanguageOptionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage { public class XlcLanguageOptionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage {
private IAdaptable element; private IAdaptable element;
private PrefCheckbox[] checkboxes;
private Button buttonVectors;
private Button buttonDecimals; private void initializeCheckboxes(Composite group) {
XlcPref[] prefs = XlcPref.values();
int n = prefs.length;
PrefCheckbox[] checkboxes = new PrefCheckbox[n];
IProject project = getProject(); // null for preference page
for(int i = 0; i < n; i++) {
String message = PreferenceMessages.getMessage(prefs[i].toString());
checkboxes[i] = new PrefCheckbox(group, prefs[i], message);
String preference = XlcLanguagePreferences.get(prefs[i], project);
checkboxes[i].setSelection(Boolean.valueOf(preference));
}
}
@Override @Override
@ -58,11 +70,7 @@ public class XlcLanguageOptionsPreferencePage extends PreferencePage implements
} }
Composite group = ControlFactory.createGroup(page, PreferenceMessages.XlcLanguageOptionsPreferencePage_group, 1); Composite group = ControlFactory.createGroup(page, PreferenceMessages.XlcLanguageOptionsPreferencePage_group, 1);
initializeCheckboxes(group);
buttonVectors = ControlFactory.createCheckBox(group, PreferenceMessages.XlcLanguageOptionsPreferencePage_preference_vectors);
initCheckbox(buttonVectors, XlcPreferenceKeys.KEY_SUPPORT_VECTOR_TYPES);
buttonDecimals = ControlFactory.createCheckBox(group, PreferenceMessages.XlcLanguageOptionsPreferencePage_preference_decimals);
initCheckbox(buttonDecimals, XlcPreferenceKeys.KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES);
return page; return page;
} }
@ -70,53 +78,36 @@ public class XlcLanguageOptionsPreferencePage extends PreferencePage implements
@Override @Override
protected void performDefaults() { protected void performDefaults() {
buttonVectors.setSelection(Boolean.valueOf(XlcLanguagePreferences.getDefaultPreference(XlcPreferenceKeys.KEY_SUPPORT_VECTOR_TYPES))); for(PrefCheckbox button : checkboxes) {
buttonDecimals.setSelection(Boolean.valueOf(XlcLanguagePreferences.getDefaultPreference(XlcPreferenceKeys.KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES))); button.setDefault();
}
super.performDefaults(); super.performDefaults();
} }
@Override @Override
public boolean performOk() { public boolean performOk() {
setPreference(XlcPreferenceKeys.KEY_SUPPORT_VECTOR_TYPES, buttonVectors.getSelection(), getProject()); IProject project = getProject();
setPreference(XlcPreferenceKeys.KEY_SUPPORT_DECIMAL_FLOATING_POINT_TYPES, buttonDecimals.getSelection(), getProject()); for(PrefCheckbox button : checkboxes) {
setPreference(button.getKey(), button.getSelection(), project);
}
return true; return true;
} }
private static void setPreference(XlcPref key, boolean val, IProject project) {
private void initCheckbox(Button checkbox, String prefKey) { String s = String.valueOf(val);
String preference = null; if(project != null)
XlcLanguagePreferences.setProjectPreference(key, s, project);
if(isPropertyPage()) { else
IProject project = getProject(); XlcLanguagePreferences.setWorkspacePreference(key, s);
preference = XlcLanguagePreferences.getProjectPreference(prefKey, project);
}
else {
preference = XlcLanguagePreferences.getWorkspacePreference(prefKey);
}
if(preference == null) {
preference = XlcLanguagePreferences.getDefaultPreference(prefKey);
}
checkbox.setSelection(Boolean.valueOf(preference));
} }
private IProject getProject() { private IProject getProject() {
return isPropertyPage() ? (IProject)element.getAdapter(IProject.class) : null; return isPropertyPage() ? (IProject)element.getAdapter(IProject.class) : null;
} }
private static void setPreference(String key, boolean val, IProject project) {
if(project != null)
XlcLanguagePreferences.setProjectPreference(key, String.valueOf(val), project);
else
XlcLanguagePreferences.setWorkspacePreference(key, String.valueOf(val));
}
public IAdaptable getElement() { public IAdaptable getElement() {
return element; return element;
} }